gdb支持通过python自动化调试,实现循环、读写内存、保存内容等复杂逻辑,不需要安装模块。
官方文档: 1acK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2%4j5i4u0W2i4K6u0W2L8%4u0Y4i4K6u0r3k6$3c8T1i4K6u0r3j5%4g2J5M7X3g2F1N6q4)9J5c8X3!0F1L8r3W2F1k6h3c8G2j5%4y4Q4x3V1k6Y4k6r3u0Q4x3X3g2Z5N6r3#2D9i4K6u0r3f1s2W2@1K9r3!0F1i4K6u0W2K9s2c8E0L8l9`.`.官方文档直接看不太容易理解,可以结合chatgpt、文心一言等工具使用。
核心函数:
脚本示例 test.py:
启动gdb,执行如下命令调用脚本:
或者直接启动时指定脚本
hello.c
python脚本
2023/5/3
gdb.execute(command [, from_tty [, to_string]])
import
gdb
gdb.execute(
"break *0x12345678"
)
"continue"
# 指定 to_string=True 可以让脚本接收输出并做后续处理,这是能让gdb和脚本交互的重要参数
the_line
=
"info registers eip"
, to_string
True
"dump memory /root/memory.dump $ebx $ebx+0x100"
// gcc -o hello hello.c
#include <stdio.h>
int
main(){
printf
(
"Hello World!\n"
);
return
0;
}
# gdb -x test.py
"file hello"
"break main"
"run"
"nexti 2"
# 获取当前被调试程序的栈帧
frame
gdb.selected_frame()
# 获取寄存器'rax'的值
rax
frame.read_register(
"rax"
# 打印寄存器的值
print
"rax的值是: 0x%x"
%
rax)
# 获取当前GDB中的被调试程序(也称为“下级”)
inferior
gdb.selected_inferior()
# 从地址rax开始读取32个字节(即0x20字节)的内存数据
the_mem
inferior.read_memory(rax,
0x20
# 打印内存数据
"the_mem: "
, the_mem.tobytes())
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课