学习 Linux 反汇编指令,核心不在于“背指令”,而在于建立“汇编 ↔ 机器码 ↔ 程序逻辑”的映射关系。下面给你一条高效、实战导向的学习路线,适合从零到能看懂、能分析、能调试。
Linux 反汇编通常涉及三层:
| 层级 | 内容 | 是否重点 |
|---|---|---|
| 汇编指令 | AT&T / Intel 语法 | ✅ 核心 |
| 反汇编工具 | objdump / gdb / radare2 / IDA | ✅ 核心 |
| 系统机制 | 调用约定、栈帧、ELF | ✅ 高频 |
| 优化与混淆 | 编译器优化、花指令 | ⏳ 后期 |
目标:能看懂函数调用和栈
必学概念:
eax / ebx / ecx / edx / esi / edi / ebp / esprax / rbx / rdi / rsi / rsp / rbp / rdxmov / add / sub / push / pop / call / ret
[参数]
[返回地址]
[old ebp]
[局部变量]
✅ 推荐材料:
目标:能把程序“拆开看”
objdump -d a.out
重点看:
<main>callretleavegdb ./a.out
disas main
info registers
常用:
si # 单步汇编
ni
x/10x $rsp
目标:看到汇编能猜出 C 代码
重点对照:
| 汇编 | C 含义 |
|---|---|
mov edi, 1 |
int a = 1 |
call printf |
printf(...) |
cmp + jne |
if / while |
push ebp |
函数开头 |
leave / ret |
函数返回 |
✅ 强烈建议:
gcc -m32 -O0 test.c -o test
objdump -d test
目标:理解“为什么这么写”
必学:
rdi, rsi, rdx...)| AT&T | Intel | 含义 |
|---|---|---|
mov %eax, %ebx |
mov ebx, eax |
方向反 |
mov $5, %eax |
mov eax, 5 |
立即数 |
(%eax) |
[eax] |
间接寻址 |
Linux 默认 AT&T 语法
objdump -M intel -d a.out
| 工具 | 用途 |
|---|---|
| gdb + pwndbg | 调试 / 反汇编 |
| objdump | 静态分析 |
| radare2 / Cutter | 进阶 |
| IDA Free | 可视化 |
| strace / ltrace | 系统调用 |
❌ 很多指令看不懂
✅ 先只看 控制流 + 函数调用
❌ 被优化后的汇编吓到
✅ 用 -O0 编译
❌ 死记指令
✅ 记住:“这条指令在改什么状态”
你可以直接告诉我:
我可以给你定制版速成笔记 + 练习程序 + 常见套路。