-
-
XCTF攻防世界int_overflow
-
发表于: 2019-10-2 19:00 9904
-
首先,进行程序基本信息检查:
没有canary,没有PIE。程序执行是先选择一个子流程,然后输入username,再输入passwd。这里要考虑程序是否会对输入的字符串的长度进行限制,先留心一下。
IDA查看一下源码:
首先看一下strings:
有收获,存在几个危险函数,而且存在"cat flag",可以考虑直接调用。
进main函数看一下:
没有发现什么大问题,直接进login。
需要留心一下,username和passwd都做了最大长度限制。但是passwd的长度未免太长了吧。。。太可疑。
进入check_passwd查看对passwd的处理:
到这里就很明显了,函数首先设定了v3变量,但是大小只有一个字节,共8bit。前面对passwd进行长度限制时,最大长度为0x199,这很明显一个字节存储不下。那么会发生什么呢?整数溢出。(后续会给出整数溢出的相关知识介绍)
输入的passwd的长度给到v3,进行判断,因为存在整数溢出,所以这里输入的字符的个数不管是3~8还是259~264都是可以通过验证的。再往下,使用strcpy将passwd拷贝进stack中,stack中给出的保存passwd的大小为0x14 :
如果输入的passwd的字符个数超过了0x14,那么就会覆盖到stack中的内容。
覆盖数据计算:
思路已经确定,利用整数溢出漏洞来输入大量的passwd字符造成栈溢出。具体长度只要在259~264之间即可。此处选择262。看一下汇编确认具体的填充数据结构:
从汇编代码中可以看到,想要覆盖到返回地址,先使用0x14 个数据覆盖stack拷贝的passed的内存区域,然后使用4字节数据覆盖ebp,再使用"cat flag"的地址覆盖返回地址,最后接上262剩余的数据即可。
所以payload的构成为:
整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数 最高位为1,负数为0,无符号数取值范围为非负数,常见各类型占用字节数如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [分享]出一点自己暂时不用的书 4748
- 玩ChatGPT有感 15726
- [注意] 2022看雪二进制漏洞小组成立通告 33237
- [分享]我和看雪的故事 -- by 有毒 31537
- [原创]多版本gcc/g++共存方案 23141