观察
用ida打开文件查看main函数:


可以发现没有输入长度限制。
接着查看vulnerable_function()的stack结构:

此外,main函数自己会调用system():

现在来找call _system这个命令的地址:

在这个页面右键点击_system并选择Text view:

便可以确定这行命令在text(即代码)部分的地址:

1 | 0804849E |
接着使用Shift+F12查看文件里的string:

由于system函数实际上接受的是一个字符串的指针,所以我们可以直接用在上面找到的/bin/sh的地址并将其作为参数传给system函数。
注意!这个程序是32bit的。
可以通过很多方面来判断:
程序中使用了
eax,ecx,esp,ebp等寄存器。这些都是32位寄存器。(如果是 64 位程序,寄存器通常会是:
rax,rcx,rsp,rbp, 等。)地址宽度是32bit的(最简单也是最重要的判断条件)
所以之后需要使用pwn库的p32(),而不是p64()。
Exploit
我们做以下操作:
- 覆盖掉
buf以及saved_registers部分(=136+4) - 将
vulnerable_function()的返回地址修改成call _system()的地址 - 将system()函数的参数改为
/bin/sh的地址
便可以成功打开shell。
所以我们需要做的是发送这段内容:
1 | payload = b"a" * (136 + 4) # buf 以及 saved_registers 的部分 |
之后便是使用ls以及cat flag命令读取flag。
Exploit代码:
1 | from pwn import * |