1. 核心功能:反汇编 (Disassembly)
最常用的就是 -d 或 -D 参数,用于将机器码翻译成汇编指令。
| 命令参数 | 描述 | 场景 |
|---|---|---|
-d | 反汇编所有可执行代码段 (.text, .init 等)。 | Bomb Lab 主要用这个。 |
-D | 反汇编所有段(包括数据段),即使它们不是可执行代码。 | 更深入的逆向工程,用于查看数据段中的 ROP Gadgets 等。 |
-S | 交错显示源码和汇编。 | 仅当编译时使用了 -g 调试符号时可用。 |
-M <style> | 指定汇编风格。 | objdump -d -M intel <file>:切换到 Intel 语法(更易读)。 |
-j <section> | 仅反汇编/显示特定段。 | 用于隔离分析 .plt, .got 等特殊段。 |
Bomb Lab 常用指令:
# 反汇编整个炸弹程序,使用 Intel 语法
objdump -d -M intel bomb2. 查看文件结构 (ELF Format Inspection)
理解 objdump 的输出结构,有助于定位关键代码和数据。
| 命令参数 | 描述 | 战略意义 |
|---|---|---|
-f | 显示文件头信息。 | 查看文件格式、架构 (elf64-x86-64)。 |
-h | 显示段头 (Section Headers)。 | 查看 .text, .data, .rodata 等段的名称、大小、加载地址。 |
-t | 显示符号表 (Symbol Table)。 | 查找函数名 (phase_1, explode_bomb)、全局变量名等。 |
-r | 显示重定位记录 (Relocations)。 | 分析动态链接的符号。 |
3. 定位关键数据
Bomb Lab 的关键字符串和常量通常存储在只读数据段(.rodata)中。
| 命令参数 | 描述 | 场景 |
|---|---|---|
-s | 显示所有段的完整内容 (Raw bytes)。 | 用于查找硬编码的字符串、密码、数组等关键数据。 |
查找字符串的战术流程:
-
找到
.rodata段的 起始地址 和 大小 (使用objdump -h)。 -
使用
objdump -s -j .rodata bomb打印该段的原始字节。 -
在原始字节中搜索可读的字符串(例如“You win!”,“Good job!”)。
4. 战术配合:GDB 与 objdump
-
objdump 的作用: 提供程序的静态地图。它告诉你每个函数从哪个地址开始,有哪些指令。
-
GDB 的作用: 提供程序的动态视图。它让你在特定的指令地址设置断点,暂停执行,观察寄存器和内存状态。
联动步骤:
-
objdump: 找到
phase_2的起始地址,例如0x401120。 -
GDB:
b *0x401120(在函数入口设置断点)。 -
GDB: 运行时使用
layout asm窗口,对照objdump的输出进行单步跟踪。
你的 Bomb Lab 行动项 (Action Item):
-
第一发试探: 对你的
bomb程序运行objdump -t bomb。 -
任务: 找出
main函数的起始地址。 -
任务: 找出所有
phase_开头的函数名称,并将它们的地址记下来。这是你进行定向爆破(Defusing)的战术地图。