核心命令
objdump
objdump 是 GNU Binutils 工具集的一部分,几乎所有 Linux 发行版都默认安装,它是查看目标文件(可执行文件、库、对象文件)信息的“瑞士军刀”。

基本用法:
objdump -d <filename>
-d(--disassemble):反汇编所有可执行节中的代码。-D(--disassemble-all):反汇编所有,包括数据部分,这会产生大量无意义的汇编代码,通常不推荐。-S(--source):在反汇编代码旁边混合显示源代码(如果可用,例如编译时带-g选项)。-s(--full-contents):显示所有节中的原始十六进制内容。-j <section>(--section=<section>):只反汇编指定的节,-j .text只反汇编代码段。-C(--demangle):对 C++ 的符号名进行反修饰(例如将_ZN3foo3barEv还原为foo::bar())。-M <instruction>:指定汇编语法风格,如intel(Intel 语法)或att(AT&T 语法,默认)。
示例:
假设我们有一个名为 my_program 的可执行文件。
基本反汇编 (AT&T 语法,默认)

objdump -d my_program
输出会类似这样:
my_program: file format elf64-x86-64
Disassembly of section .text:
0000000000401126 <main>:
401126: push %rbp
401127: mov %rsp,%rbp
40112a: sub $0x10,%rsp
40112e: mov %edi,-0x4(%rbp)
401131: mov %rsi,-0x10(%rbp)
...
使用 Intel 语法 (更易读)
objdump -d -M intel my_program
输出会变为:
my_program: file format elf64-x86-64
Disassembly of section .text:
0000000000401126 <main>:
401126: push rbp
401127: mov rbp,rsp
40112a: sub rsp,0x10
40112e: mov dword ptr [rbp-0x4],edi
401131: mov qword ptr [rbp-0x10],rsi
...
混合显示源代码

编译时需要带 -g 选项:gcc -g my_program.c -o my_program
objdump -d -S my_program
这会在汇编指令旁边显示对应的 C 源代码,非常有助于理解。
gdb
gdb (GNU Debugger) 是一个强大的源码级调试器,但它也内置了非常出色的反汇编功能,特别适合在调试过程中动态地查看函数或代码块的反汇编结果。
基本用法:
首先启动 GDB:
gdb ./my_program
进入 GDB 后,使用以下命令:
-
disassemble/disas:反汇编函数或内存地址。disassemble function_name: 反汇编指定函数。(gdb) disassemble main
disassemble address1, address2: 反汇编一个地址范围。(gdb) disassemble 0x401120, 0x401140
disassemble $pc, +20: 从当前程序计数器($pc)开始反汇编接下来的 20 条指令。
-
set disassembly-flavor:切换汇编语法。(gdb) set disassembly-flavor intel (gdb) disassemble main
-
x/examine:检查内存内容,可以用来反汇编。x/10i $pc: 从$pc开始,以指令格式(i)显示 10 条。(gdb) x/10i $pc
x/20i 0x401120: 从地址0x401120开始,以指令格式显示 20 条。
GDB 的优势:可以结合断点、单步执行等调试功能,实时观察代码的执行流程和寄存器/内存的变化,是逆向分析和漏洞挖掘的利器。
objdump + strings + grep (组合使用)
在实际分析中,我们经常需要结合多个工具来获取完整信息。
strings:从二进制文件中可打印的字符串。grep:搜索文本。
典型场景:你想找到某个包含特定字符串(如 "password")的函数,并反汇编它。
# 1. 用 strings 和 grep 找到包含 "password" 的地址 strings my_program | grep -n "password" # 假设输出是:12345: Enter your password: # 2. 用 objdump 查看字符串所在的节,找到其地址 objdump -s -j .rodata my_program | grep "Enter your password" # 假设输出显示该字符串在 .rodata 节的某个地址,0x404000 # 3. 在 GDB 中,使用 x/10i 在该地址附近查找函数调用或跳转 # 或者,如果你知道函数名,直接反汇编该函数 # (gdb) disassemble check_password
进阶与专业工具
对于更复杂的任务,如恶意软件分析、混淆代码分析,你可能需要更专业的工具。
radare2 / rizin
radare2 (现在常被称为 rizin) 是一个开源的逆向工程框架,功能极其强大,命令行驱动,拥有丰富的脚本和分析功能,它被设计为可扩展的逆向平台。
基本用法:
# 分析文件 rizin -A ./my_program # 进入交互式 shell rizin> # 在 shell 中 [0x00401126]> pdf # 打印反汇编的函数 (print disas function) [0x00401126]> afl # 列出所有函数 (analyze functions) [0x00401126]> s sym.main # 跳转到 main 函数符号 [0x00401126]> VV # 进入可视化视图
优势:速度快,分析自动化程度高,拥有图形化界面(VV 命令),非常适合大型二进制文件的分析。
Ghidra
Ghidra 是美国国家安全局发布的一款开源逆向工程套件,它是一个图形化工具,功能非常强大,集成了反汇编、反编译、脚本编写和分析套件。
基本用法:
- 启动:
ghidraRun - 创建新项目,导入你的目标文件。
- 自动分析:Ghidra 会自动执行分析,包括函数识别、数据类型推测等。
- 查看:在左侧的 "Listing" 视图中查看反汇编代码,在 "Decompiler" 视图中查看 C 语言风格的伪代码。
优势:图形化界面直观易用,反编译器质量非常高,对于理解复杂的控制流和算法非常有帮助。
总结与对比
| 工具 | 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
objdump |
命令行 | 简单、快速、系统自带 | 功能相对单一,交互性差 | 快速查看二进制基本信息,快速反汇编检查 |
gdb |
命令行 | 强大的调试功能,可动态分析 | 需要调试环境,分析静态文件时稍显笨重 | 动态调试,分析程序运行时行为,漏洞分析 |
radare2/rizin |
命令行/框架 | 极其强大、快速、可扩展、有图形界面 | 学习曲线陡峭,命令繁多 | 大型/复杂二进制分析,自动化脚本,恶意软件分析 |
Ghidra |
图形化 | 功能全面,反编译器优秀,界面友好 | 资源消耗较大,启动慢 | 深度静态分析,理解算法逻辑,恶意软件分析 |
学习建议
- 从
objdump开始:掌握-d,-S,-M intel等基本选项,这是最基础也是最重要的技能。 - 学习
gdb:学会用disassemble和x/i来查看代码,并尝试结合断点进行调试,这是从静态分析走向动态分析的关键一步。 - 探索
Ghidra:当你需要进行复杂的静态分析时,Ghidra的图形界面和反编译器会让你事半功倍。 - 挑战
radare2:当你成为高级用户,需要处理大量自动化任务或性能要求极高的分析时,radare2会是你强大的武器。
对于初学者和日常使用,objdump + gdb 的组合已经足够应对绝大多数情况。
