观察
用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 * |