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")