下面给你一套Linux 下反汇编(Reverse / Disassembly)入门路线,从“能看懂”到“能分析”,偏实战,不堆理论。
反汇编 ≠ 逆向工程全部
它只是:
把机器码 → 汇编指令
常见用途:
必须会:
file
strings
xxd / hexdump
objdump
nm
readelf
重点不是“背指令”,而是理解:
| 概念 | 说明 |
|---|---|
| 寄存器 | rax, rbx, rsp, rbp, rip |
| 栈 | push / pop / call / ret |
| 函数调用 | System V ABI |
| 指令 | mov, add, sub, cmp, jmp, call |
✅ 推荐先学 x86-64(AMD64)
❌ 不建议一上来就 ARM
objdump -d ./a.out
常用:
objdump -M intel -d ./a.out
说明:
-M intel:Intel 语法(比 AT&T 好看)-d:反汇编代码段✅ 适合:看函数结构、学习汇编
gdb ./a.out
常用命令:
disas main
info registers
x/10i $rip
break main
run
stepi
进阶:
gdb -q ./a.out
set disassembly-flavor intel
✅ 适合:理解程序执行流程
r2 ./a.out
常用:
aaa
s main
pdf
或用图形界面:
cutter
✅ 适合:逆向工程、漏洞分析
int main() {
int a = 1;
int b = 2;
return a + b;
}
编译:
gcc -m64 -O0 -no-pie -fno-stack-protector test.c -o test
objdump -M intel -d test | less
重点看:
mainpush rbpmov rbp, rspmov DWORD PTR [rbp-4], 1gdb ./test
disas main
break main
run
stepi
readelf -h test
readelf -S test
重点理解:
.text(代码).data(已初始化数据).rodata(只读数据).plt / .got(函数调用)| 场景 | 方法 |
|---|---|
| 找 main | objdump -d + 搜索 main |
| 找字符串 | strings ./a.out |
| 找系统调用 | strace ./a.out |
| 分析函数调用 | GDB + bt |
| 去混淆 | 动态调试 + 多次运行 |
反汇编不是“看懂每一行汇编”,而是“知道程序在干什么”。
如果你愿意,我可以:
你更想往 安全 / 漏洞 / CTF / 内核 哪个方向走?