gdb原生不支持直接分析.raw或.dmp等离线内存镜像,仅支持ELF、core文件及运行中进程;需先用Volatility提取进程内存块,再指定基址加载至gdb分析。

直接用 gdb 无法分析内存镜像——它不支持离线内存转储文件
很多人误以为 gdb 能像调试运行中进程一样加载 .raw 或 .dmp 内存镜像进行逆向,但事实是:gdb 原生只支持 ELF 可执行文件、核心转储(core)和正在运行的进程(attach)。它不能直接解析物理内存镜像(如 LiME 或 AVML 生成的 raw dump),因为这类文件没有标准段结构、符号表或进程上下文。
常见错误现象包括:
gdb: Can't read pathname for load map: No error information- 加载后
info proc mappings报错或为空 -
read memory操作返回无效地址或全零
真正能处理 raw 内存镜像的是 Volatility 或 Rekall 这类内存取证框架。它们内置了 Linux 内核版本识别、页表解析、进程提取等能力。而 gdb 的作用,是在你已从内存镜像中提取出某个可疑进程的用户空间映像(比如用 volatility linux_pslist + linux_dump_map 导出的 proc.<pid>.<start>-<end>.raw</end></start></pid>)之后,再对这个「裁剪后的进程内存块」做静态分析。
先用 volatility 提取可疑进程的用户空间内存块
假设你已有 memory.dump(LiME 生成的 raw 镜像),且通过 linux_pslist 发现 PID 为 1234 的进程行为异常:
- 确认内核版本:
volatility -f memory.dump linux_banner,确保插件兼容(如linux_centos7_3_10_0_1160) - 列出进程:
volatility -f memory.dump --profile=Linuxcentos7_3_10_0_1160x64 linux_pslist - 查看该进程内存布局:
volatility -f memory.dump --profile=... linux_proc_maps -p 1234 - 导出代码段(如
.text对应的[heap]或[anon]区域):volatility -f memory.dump --profile=... linux_dump_map -p 1234 --dump-dir ./dumps/
执行后你会得到类似 proc.1234.7f8a20000000-7f8a20021000.raw 的文件——这才是 gdb 能处理的「有效载荷片段」。
用 gdb 加载并检查提取出的内存块
关键点:你必须手动指定加载基址,否则 gdb 不知道这段二进制该映射到哪。假设 volatility 显示该段虚拟地址是 0x7f8a20000000:
- 启动 gdb:
gdb -q ./dumps/proc.1234.7f8a20000000-7f8a20021000.raw - 告诉 gdb 这段数据应加载到哪个地址:
(gdb) add-symbol-file /dev/null 0x7f8a20000000(用/dev/null表示无符号文件,仅占位) - 读取内存内容:
(gdb) x/20i 0x7f8a20000000查看头几十条指令 - 搜索 shellcode 特征:
(gdb) find /b 0x7f8a20000000, +0x21000, 0x48, 0x89, 0xe5(找push rbp; mov rbp, rsp类函数入口)
注意:这类内存块通常不含符号、无重定位信息,gdb 无法自动识别函数边界或字符串。你需要结合 strings -a -n 4 ./dumps/proc.1234.*.raw | grep -E "(http|tcp|pool|monero|xmr)" 先定位敏感字符串,再回溯到对应地址用 gdb 反汇编。
容易被忽略的三个硬伤
实际操作中最常卡在这三点:
-
volatilityprofile 错配会导致linux_proc_maps解析失败,表现为找不到进程或内存区域为空——必须用linux_banner和目标系统uname -r严格比对 - 提取的内存块可能跨页、含空洞,
gdb读取时遇到未映射区域会报Cannot access memory,需用volatility linux_dump_map -p <pid> --dump-dir</pid>分段导出,而非试图合并整个地址空间 - 恶意载荷常使用自修改代码(SMC)或解密后才写入内存,你在镜像里看到的可能是加密态或 stub,直接反汇编会全是非法指令——得先用
volatility linux_yarascan扫描 AES/RC4 密钥调度特征,再定位解密函数入口


















