在 Linux 下进行反汇编(disassembly)和逆向分析时,有几个关键点和常见坑需要注意。下面从工具链、二进制格式、架构、符号与调试信息、安全机制、实战习惯等方面系统说明。
Linux 可执行文件大多是 ELF(Executable and Linkable Format)
重点关注:
工具查看:
readelf -h a.out
readelf -S a.out
| 工具 | 特点 |
|---|---|
| objdump | 基础、稳定、适合脚本 |
| gdb | 动态调试 + 反汇编 |
| radare2 / r2 | 强大、学习曲线陡 |
| IDA Pro | 图形化、商业 |
| Ghidra | 免费、支持反编译 |
| capstone | 库,适合自己写工具 |
示例:
objdump -d a.out
gdb a.out
(gdb) disas main
cdecl / stdcallrdi, rsi, rdx, rcx, r8, r9file a.out
# ELF 64-bit LSB executable, x86-64
⚠️ 注意:
建议:
gcc -O0 -g -o test test.c
关闭优化,方便学习。
nm a.out
objdump -d -M intel a.out
GDB 中:
info functions
info variables
Linux 大量使用动态库:
反汇编时常见:
call puts@plt
⚠️ 注意:
cat /proc/sys/kernel/randomize_va_space
调试时可临时关闭:
setarch $(uname -m) -R ./a.out
__stack_chk_failLinux 特有:
rax:系统调用号rdi, rsi, rdx...:参数参考:
man 2 syscall
✅ 推荐做法:
file / readelf 再看汇编❌ 常见坑:
objdump + gdb如果你愿意,我可以:
你现在是学习阶段、做安全、还是调试问题?