在 Linux 下进行反汇编(尤其是用 objdump、gdb、IDA、radare2 等工具)时,有很多容易踩坑的地方。下面按常见误区 → 原因 → 建议的方式总结,偏实战。
Linux 默认常用 AT&T 语法(尤其是 objdump):
mov %rax, %rbx
而很多人习惯 Intel 语法:
mov rbx, rax
❌ 坑:
%,立即数带 $✅ 建议:
objdump -d -M intel ./a.out
或 GDB:
set disassembly-flavor intel
objdump -d a.out
❌ 坑:
.data、.rodata 被当代码反汇编✅ 建议:
objdump -d -j .text a.out
objdump -d --start-address=0x401000 --stop-address=0x401100 a.out
file a.out
# stripped
❌ 坑:
401000 <main>: 消失✅ 建议:
plt / gotobjdump -d a.out
❌ 坑:
eax vs rax)✅ 建议:
file a.out
objdump -d -M intel a.out
ARM 上:
bx lr
❌ 坑:
✅ 建议:
objdump -d -m arm
objdump -d -m thumb
❌ 坑:
✅ 建议:
Linux x86_64:
rdi, rsi, rdx, rcx, r8, r9
❌ 坑:
caller-saved / callee-saved✅ 建议:
push/pop 是否对称and rsp, -16
❌ 坑:
movaps 崩溃✅ 建议:
call 前 rsp % 16 == 8if (x) f();
可能被:
❌ 坑:
✅ 建议:
gcc -O0 -g
分析时对照源码
jmp func
❌ 坑:
disas
❌ 坑:
✅ 建议:
disas $pc, +20
./a.out
❌ 坑:
✅ 建议:
gdb -p $(pidof a.out)
或关 PIE:
gcc -no-pie -fno-pie
objdump -d shellcode
❌ 坑:
✅ 建议:
objdump -b binary -m i386 -D shellcode.bin
.plt / .got❌ 坑:
✅ 建议:
plt 和 gotobjdump -RLinux 反汇编最大的坑:工具默认行为 + 架构差异 + 编译器优化 + 动态特性。
如果你愿意,我可以: