gdb_python初探

# PREFACE:感觉有时候用得到(其实是看到了别人的脚本不会用
# https://www.hex-rays.com/products/ida/support/idadoc/1343.shtml
gdbserver --multi *:1234

然后可以在 gdb 里面使用 gdb 脚本

使用方法:

(gdb) source path/to/your/script.py

几个 api 使用:

  • 使用 gdb 内部的指令:
gdb.execute('指令')
# eg.
gdb.execute('c')  
gdb.execute('b *0x55555559C078')
  • 获取寄存器:
frame = gdb.selected_frame()
rip = frame.read_register("rip")

其实感觉只需要 gdb.execute ,配合 gdb 原生的指令,就可以愉快开始 hook 了,甚至可以轻松把调试过程都记录下来,确实好东西

比如这样:

while 1:
    frame = gdb.selected_frame()
    rip = frame.read_register("rip")
    if rip == 0x55555559C078 :	# 这里是断点
        rdx = frame.read_register("rdx")
    gdb.execute('c')

一些其他的 tips:

从 AT&T 语法切换到 intel 语法:

echo ‘set disassembly-flavor intel’ >> ~/.gdbinit

使用 gdb 自带的指令

gdb -x script.gdb ./file

script.gdb

条件断点,eg. 在断点处打印 $rax 或执行一些需要的操作;类似 idapython print(get_reg_value('rax'))

b *main
commands
	silent
	p $rax
	continue
end
r
q

补:这里有一个 issue,dbg 或者 gef 用的时候会调用一个有 bug 的 gdb api,有需要 continue 的时候用 pi gdb.execute("continue")