# 此处用于记录在编写脚本中对程序的调试
因为有时要输入不可见字符,导致我们没办法进行直接在 gdb 内调试,所以需要相应的在脚本中调试
# 1. 调试方法:
gdb.attach(p,"b *断点地址") | |
payload="" | |
pause() #第一个 pause | |
p.sendline() | |
pause() #第二个 pause |
此处的重点就是在发送 payload
前加入 gdb.attach(p)
和 pause()
,发送 payload
后加入 pause()
,然后在产生的新终端内设置断点(也可以在前面直接设置断点: gdb.attach(p,"b *0x8048600")
)
然后新终端内输入 c
继续执行,旧终端内按下回车便可以进行查询得到相应的栈情况
不知道为什么要加入两个 pause()
才行,前面一个防止程序直接发送结束,无法加入断点;后面一个不加入会导致无法读取栈的情况(程序貌似没有运行结束,个人猜测是设置断点的地方已经不需要栈了)
# 2. 调试例子:
左边为新终端,右边为旧终端(pid 相同)
此时已经在代码里设置好了断点,在新终端内输入 c
, 旧终端按回车即可
可以看到已经发送了 payload
可以看到已经发送的内容到了栈上
(输入的值是 crashme,由于是小端序所以要倒着读,c 是 63,r 是 72,所以输入的位置是 0x22)
上述例子具体的代码:
from pwn import *
p=process('./ez_pz_hackover_2016')
context.log_level='debug'
gdb.attach(p) ## 会在此处再打开一个终端
# 'b *0x8048600' ##在该终端下设置对应断点(要设置在对应函数结束之前),设置完后必须在新终端按下“c”来继续进行,再在旧终端里按下回车
,
p.recvuntil('crash: ')
stack=int(p.recv(10),16)#接收s在栈上的地址
payload='crashme\x00'+'aaaaaa'#crashme\x00绕过if判断
pause() #必须要在发送的payload前面,不然直接发送结束无法查询了
p.sendline(payload)
pause() #