在pwn里面,几个重要的工具有IDA,ollydbg,gdb(pwndbg,peda…),pwntools等
IDA是比较全面的工具,界面也比较友好,但是动态调试elf比较麻烦,需要选中remote linux debugger,详见IDA+pwntools环境搭建,这里使用pwntools进行交互的好处作者提到是可以 发送不可打印字符,但是我按照作者的教程,pwntools成功连接上ubuntu docker里面运行的elf,并在IDA中attach上该elf,按下F9运行,EIP却依然指向vsdo(vsdo好像是某种系统调用,具体还得去研究原因),并不能停在已经设置好的断点处,很奇怪的是这时候send过去字符,IDA的界面上程序就会跳到断点处了,如下面所示:
上面的第一个断点像被跳过了一样,直接跳到了第二个断点,而且因为在IDA和kali虚拟机之间切换还是很麻烦的。。。加上还有ubuntu的docker,端口socat转发之类的操作,实在麻烦,因此自己研究了一下pwntools里面自带的gdb方法
举上面链接的教程0x01里面的一个elf——hello做例子,在python控制台里面输入
>>>from pwn import *
>>>io = gdb.debug('./hello', 'break main')
之后会跳出一个gdb的终端窗口,停在了程序初始化的指令处(大概是?),接着在gdb窗口中输入c
,继续运行,程序停在了刚刚设置的main处,在hello函数内设置断点:
pwndbg> disass hello
Dump of assembler code for function hello:
0x08048484 <+0>: push ebp
0x08048485 <+1>: mov ebp,esp
0x08048487 <+3