如何用脚本在-O2编译的非PIE C程序中dump动态分配数组
用GDB实现无调试信息下的内存dump自动化
完全可以用GDB完成你的所有需求,无需额外工具。因为你用了-no-pie编译,全局变量和指令的虚拟地址固定,即使没有-g生成的调试信息,GDB依然能直接通过内存地址完成操作。以下是具体实现步骤:
1. 提前获取必要的地址
用objdump提取两个关键地址:
- 全局变量
array的内存地址:执行objdump -t a.out | grep "array",输出中会显示array的虚拟地址(示例值:0x404010)。 - 目标指令地址:执行
objdump -D -S a.out,找到foo或bar中你要暂停的指令对应的地址(示例值:0x401234)。
2. 编写GDB自动化脚本
创建一个GDB脚本文件(比如dump_script.gdb),内容如下:
# 在指定指令地址处设置断点 break *0x401234 # 启动程序 run # 读取全局array指针指向的动态数组基地址 # 0x404010替换为objdump得到的array变量实际地址 set $array_base = *(double**)0x404010 # 将指定字节的内存dump到文件 # 0x2000替换为你需要dump的实际字节数 dump binary memory array_dump.bin $array_base $array_base + 0x2000 # 退出GDB quit
3. 执行自动化脚本
在终端运行以下命令,GDB会自动完成所有操作:
gdb -batch -x dump_script.gdb a.out
关键注意事项
- 因为
-no-pie编译确保地址固定,每次编译后objdump得到的地址可重复使用,无需重新提取。 - 整个过程不修改原程序,完全符合你「测试程序与无中间打印的程序一致」的要求,适配位翻转注入的分析场景。
- 如需在多个指令地址处dump内存,只需在脚本中添加多组
break、run、dump步骤即可。
内容的提问来源于stack exchange,提问作者kpjoshi
相关产品推荐
相关产品推荐

