在 Linux 下反汇编(disassembly)程序,通常是为了分析二进制文件(如 ELF 可执行文件、共享库、内核模块等)的汇编代码。下面按常用工具 → 常见用法 → 实战示例 → 进阶技巧来说明。
GNU binutils 自带,适合静态反汇编。
objdump -d ./program
常用选项:
objdump -M intel -d ./program # Intel 语法(默认是 AT&T)
objdump -s -j .text ./program # 同时显示 hex + 反汇编
objdump -t ./program # 查看符号表
objdump -h ./program # 查看段信息
✅ 适合快速查看 .text 段
❌ 不适合复杂控制流分析
调试器中可直接反汇编。
gdb ./program
GDB 常用命令:
disassemble main
disassemble 0x401000
disassemble /r main # 显示机器码
info functions
使用 Intel 语法:
set disassembly-flavor intel
✅ 可结合运行态分析
✅ 支持断点、寄存器查看
功能强大,适合逆向工程。
r2 ./program
常用命令:
aaa # 自动分析
pd 20 # 反汇编 20 条指令
pdf # 反汇编当前函数
s main # 跳到 main
pdf @ main
输出可读性高,支持流程图(Vim 模式或 V)。
✅ 带反编译(C 伪代码)
❌ 学习成本高 / 商业工具
高级用户:
llvm-objdump -d ./program
#include <stdio.h>
int main() {
printf("Hello\n");
return 0;
}
编译(关闭优化,保留符号):
gcc -g -O0 -no-pie hello.c -o hello
反汇编 main:
objdump -M intel -d hello | grep -A 20 "<main>:"
.textobjdump -d -j .text ./program
objdump -d --start-address=0x401000 --stop-address=0x401050 ./program
| 情况 | 说明 |
|---|---|
| 有符号 | 函数名清晰 |
| stripped | main 消失,需手动分析入口点 |
查看是否 stripped:
file ./program
手动找入口:
readelf -h ./program
readelf -h ./program
readelf -S ./program
strings ./program
objdump -d ./program # 汇编
# 或
r2 -> pdg # Ghidra/IDA 更适合
gcc -g -O0 -no-pie -fno-stack-protector program.c -o program
gdb ./program
推荐编译选项(方便反汇编):
-O0:不做优化-no-pie:地址固定-g:调试信息| 工具 | 用途 |
|---|---|
| objdump | 静态反汇编 |
| gdb | 动态分析 |
| radare2 | 逆向分析 |
| Ghidra | 逆向 + 反编译 |
| IDA | 专业逆向 |
告诉我你的具体场景(CTF / 安全研究 / 漏洞分析 / 学习汇编),我可以给你更针对性的方案。