温馨提示×

怎么看懂Linux反汇编

小樊
46
2026-08-05 04:17:58
栏目: 智能运维

看懂 Linux 下的反汇编,核心不是“背指令”,而是建立一套从“程序 → 汇编 → 你在看什么”的认知框架。下面我按由浅入深 + 实战角度来讲,适合初学者到进阶。


一、先搞清楚:你在看的是“什么反汇编”

Linux 下常见的反汇编来源有 3 种:

类型 常见工具 说明
ELF 可执行文件 objdump 静态反汇编
正在运行的程序 GDB 动态反汇编
二进制流 ndisasm / capstone 裸机器码

最常见的是:

objdump -d ./a.out

或:

gdb ./a.out
(gdb) disassemble main

二、先补 3 个必须懂的基础(否则看不懂)

1️⃣ CPU 架构(最常见是 x86 / x86-64)

Linux 反汇编 90% 是 x86-64(AMD64)

你需要知道:

  • 指令长度不固定(1~15 字节)
  • 有大量寄存器
  • AT&TIntel 两种语法

2️⃣ 汇编语法:AT&T vs Intel(非常重要)

AT&T(GCC / objdump 默认)

mov    -0x4(%rbp),%eax

特点:

  • 源在前,目的在后
  • 寄存器加 %
  • 立即数加 $
  • 内存用 ()

Intel(GDB 可切换)

mov eax, [rbp-4]

强烈建议初学用 Intel 语法

objdump -M intel -d ./a.out

或 GDB:

set disassembly-flavor intel

3️⃣ 必须认识的寄存器(x86-64)

寄存器 作用
rax 返回值
rsp 栈顶
rbp 栈底(帧指针)
rdi rsi rdx rcx r8 r9 函数参数
rip 当前指令地址

三、看懂函数调用(最关键)

1️⃣ 一个最简单的 C 程序

int add(int a, int b) {
    return a + b;
}

编译:

gcc -O0 -fno-pic -o test test.c

反汇编(Intel 语法):

add:
    push   rbp
    mov    rbp, rsp
    mov    DWORD PTR [rbp-4], edi
    mov    DWORD PTR [rbp-8], esi
    mov    eax, DWORD PTR [rbp-4]
    add    eax, DWORD PTR [rbp-8]
    pop    rbp
    ret

2️⃣ 逐行解释

push rbp        ; 保存调用者栈帧
mov rbp, rsp    ; 建立新栈帧
mov [rbp-4], edi   ; 参数 a
mov [rbp-8], esi   ; 参数 b
mov eax, [rbp-4]
add eax, [rbp-8]   ; a + b
pop rbp
ret                ; 返回

返回值一定在 rax


四、看懂系统调用(Linux 特有)

Linux 程序不是“直接跑”,而是:

用户态 → syscall → 内核

例子:exit(0)

mov rax, 60     ; syscall 号
mov rdi, 0      ; 参数
syscall

常见 syscall 号(x86-64):

syscall
read 0
write 1
open 2
exit 60

五、看懂 if / for / while(控制流)

if 示例

if (a > b) return 1;
cmp edi, esi
jle .L1
mov eax, 1
ret
.L1:

关键指令:

  • cmp:比较
  • jxx:条件跳转
指令 含义
je 相等
jne 不相等
jg 有符号大于
jl 有符号小于

六、看懂栈(这是难点)

栈增长方向

高地址
...
rbp
局部变量
rsp
低地址

常见模式:

sub rsp, 16   ; 开栈
mov [rbp-4], 5

七、实战:如何“读”一段反汇编

步骤建议(非常重要)

  1. 先找函数边界

    • push rbp / mov rbp, rsp
    • ret
  2. 找参数

    • rdi, rsi, rdx...
  3. 找返回值

    • rax
  4. 找逻辑

    • cmp + jmp(分支)
    • call(函数调用)
  5. 忽略噪音

    • 编译器优化产生的冗余指令

八、推荐工具链(强烈建议)

工具 用途
objdump -M intel 静态反汇编
gdb 动态调试
radare2 / r2 逆向
IDA Free 图形化
Compiler Explorer 看 C → 汇编

九、学习路线(不走弯路)

✅ 第 1 阶段(1 周)

  • 看懂函数调用
  • 看懂参数 / 返回值

✅ 第 2 阶段(2 周)

  • 看懂 if / for / while
  • 看懂栈变化

✅ 第 3 阶段

  • 看懂 syscall
  • 看懂 PLT / GOT(动态链接)

✅ 第 4 阶段

  • 逆向真实程序
  • exploit / 漏洞分析

十、如果你愿意,我可以:

  • ✅ 手把手带你 逐行反汇编一个真实程序
  • ✅ 对比 C → 汇编
  • ✅ 专门讲 栈溢出 / ROP / exploit
  • ✅ 用 图示 画堆栈变化

你可以直接说一句:

“用这个 C 程序,帮我逐行讲反汇编”

0