You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用脚本在-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:23