GDB 利用 Python 扩展 GEF 插件
复制本地路径 | 在线编辑
前言
例子:在开了 PIE 的程序下,如何根据偏移量可以设置断点。每一次都要先用 vmmap 查找基址,然后加起来,然后开断点。往往要加很多断点,并且要调试很多遍,如果每次都是手动会非常麻烦,因此能否写一个命令,参数是偏移量,自动地寻找 PIE 基地址,然后在偏移位置加断点呢。
步骤
-
先熟悉GEF,了解是否有别人已经写好可以利用的方法。在这个例子中,我们要找基址,有两点思想。
-
首先是猜和观察,看看有哪条命令可能会利用到我们想要的功能。我是根据 GEF 可以打印堆的信息来进行查找的,查找 tcache bins,很快就找到了方法,获取地址有现成方法
get_process_map() -
要及时输出调试。从一开始就要输出,然后才有底。比如当我找到了
get_process_map(),在该函数末尾把结果 print 一下,然后在 gdb 里面调用heap bins(查看 heap 的命令),这时就会输出get_process_map()的返回内容,因此就知道这个函数会返回哪些东西了。 -
之后就可以写脚本了,参考 GEF 的官方文档给出的模板,很简单,最终结果在下面。
# 只给出了关键的部分 class Break_in_pie(GenericCommand): def do_invoke(self, argv): save_map = get_process_maps() index = 0 while True: base_addr = save_map[index].page_start index += 1 if base_addr > 0x100000000000 : break real_addr = int(base_addr) # 表示偏移量的参数是十六进制还是十进制 if argv[0][1] == 'x': real_addr = real_addr + int(argv[0], 16) else: real_addr = real_addr + int(argv[0], 10) gdb.execute('break *' + str(real_addr)) return register_external_command(Break_in_pie())
细节
- 利用GEF,要利用写好的命令,里面写好的方法也是可以利用的
- 参数列表就是
do_invoke(self, argv)的 argv