# 此处用于记录在编写脚本中对程序的调试

因为有时要输入不可见字符,导致我们没办法进行直接在 gdb 内调试,所以需要相应的在脚本中调试

# 1. 调试方法:

n
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()  #