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