三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

BugkuCTF-pwn Easy_int题解 整数溢出(学习过程持续更新)

BugkuCTF-pwn Easy_int题解 整数溢出(学习过程持续更新)

本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题

今天学到整数溢出了,所以就来练练这种题,但是不知道今天为啥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}

此题完

← 返回列表