gdb新的理解
前言:
其实感觉之前一直有gdb调试恐惧症。
但是通过最近的练习和复现,对gdb有了一些新的理解与感悟。
之前常常因为搞不清楚调试的位置,不知道怎么查看想看的程序执行情况而苦恼。
通过最近的联系理解了断点的重要性,以及一些新的gdb指令。
希望可以一直进步下去!!!
新学会了用python交互模式进行gdb的单步调试
下面以一个简单的uaf堆题为例:
题目(buuctf easyfast):
menu:

creat:

shell:


这里可以看到data段的全局变量602090初始的时候是1
delete:

这里存在一个 **uaf **漏洞。
edit:

思路:
这里的思路就是利doublefree或者 uaf 将 全局变量602090变为0
脚本:
1 | from pwn import* |
动态调试part1:
- 首先开启一个python3 解释器:

这里同时也可以看到我们启动了一个进程72687
- 同时开启另一个gdb终端:

attach (pid)在gdb里面附件进程。
- 设置关键断点:



在三个关键函数的返回处设置断点

然后continue等待解释器输入

- 开始进行单步调试:

这里定义函数
然后下面我们执行了alloc(0x40)创建了0x40大小的堆块

这里可以看到右边的终端停在了我们设置的断点

这里也可以看到我们的堆块创建成功。
这样调试可以看到每步的执行情况。
每次进入Continuing.等待执行时候在python解释器执行新的指令

这里看到成功把chunk0的fd改为全局变量-0x10,然后后面通过edit就可以修改这个伪造的堆块,也就是我们需要利用全局变量

查看全局变量buf
可以看到我们的目标地址被当作了一个堆块。后面就修改堆块3即可。

这里可以看到我们成功启动了shell的进程:


注意:
ctrl + d 退出python解释器
想看执行情况可以随时ctrl + c暂停gdb终端
动态调试part2:

这里可以看到我们进入了interactive mode


继续4执行shell()成功
同时可以利用interactive mode和gdb.attach()


这里就是说当写脚本的时候可以利用interactive mode 继续往下执行gdb.attach后面的内容。