本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
今天学到整数溢出了,所以就来练练这种题,但是不知道今天为啥buuctf里没办法下载文件了,所以就在BugkuCTF找了一道题来做
此处我将文件命名为easy_int
checksec easy_int 查看一下保护机制
可以看到这是一个64-bit的文件,只有NX保护开启了
将文件拖入ida64,按F5将汇编代码转换成c语言代码,得到
我们可以看到此处让我们输入一个数NUM,如果NUM<0,并且NUM取相反数后仍然小于0,就可以进入vuln()函数。NUM是一个int型,取值[-2**31,2**31-1],所以如果我们让NUM =-2147483648,那NUM = -NUM → -(-2147483648) 发生溢出,32位int无法表达 2147483648,溢出后结果依然是 -2147483648,这样我们就可以进入vuln()
可以看到vuln()里存在明显的 read(0LL, &v2, 256LL)栈溢出,我们利用这个将返回地址覆盖成我们的ROP链
回到虚拟机
ROPgadget --binary easy_int --only "pop|ret"
得到pop_rdi_ret = 0x401343,ret_addr = 0x40101a
gdb easy_int
b *0x4011e4(在read处下断点)
r
-2147483648
n
AAAAAAAA
stack 24
可以看到我们输入的数据距离rbp(0x30-0x10=)0x20字节,再加上0x8字节至return address
q
nano exp.py
bin_sh是在ida里得到的,按shift+F12,双击/bin/sh,得到
第一次send发生整数溢出,第二次send发生栈溢出,构造ROP链
保存退出
python3 exp.py
cat flag
得到flag
flag{3f4fa6b09422e4be88ebc33ac9e3500b}
此题完