温馨提示×

怎样学Linux反汇编

小樊
36
2026-07-09 19:11:00
栏目: 智能运维

学习 Linux 反汇编是一个循序渐进、偏实战的过程,核心是把 汇编 + 程序运行原理 + 工具链 打通。下面给你一条比较系统、可落地的学习路线,并附上推荐资源和常见坑。


一、前置知识(非常重要)

1️⃣ Linux 基础

必须会的基本操作:

  • 文件、进程、权限
  • gcc / g++ / make
  • objdump / file / strings / ldd
  • 调试符号、ELF 文件概念

✅ 推荐:

  • 《Linux 命令行与 Shell 脚本编程大全》
  • 或熟悉 Ubuntu / Debian 日常使用

2️⃣ C 语言(重点)

反汇编本质是“看懂编译器干了什么”。

必须掌握:

  • 指针、数组、结构体
  • 函数调用
  • 栈和内存布局
  • main 的参数(argc/argv

✅ 推荐:

  • 《C Primer Plus》
  • 或《C 程序设计语言(K&R)》

二、汇编语言(核心)

1️⃣ x86 / x86-64 汇编(Linux 主流)

重点不是“写汇编”,而是能读懂反汇编代码

必学内容

  • 寄存器:RAX, RBX, RCX, RDX, RSP, RBP, RIP
  • 指令:
    • mov, add, sub, cmp, jmp, call, ret
    • push / pop
  • 寻址方式
  • 函数调用约定(System V AMD64 ABI)
    • 参数传递:RDI, RSI, RDX, RCX, R8, R9
    • 返回值:RAX

✅ 推荐资源:

  • 《汇编语言(王爽)》(入门思路好,但偏 x86-16)
  • 《Professional Assembly Language》
  • 在线:
    • https://godbolt.org(看 C → 汇编)

三、ELF 与程序运行原理

1️⃣ ELF 文件结构

理解反汇编“从哪来”。

重点:

  • .text(代码)
  • .data / .bss
  • .rodata
  • .symtab / .strtab
  • 入口点 _start vs main

✅ 工具:

readelf -h a.out
readelf -S a.out
objdump -d a.out

2️⃣ 程序的内存布局

  • 栈(stack)
  • 堆(heap)
  • 代码段
  • 数据段

理解:

  • 函数调用栈帧
  • 局部变量在栈上
  • 栈溢出原理

四、反汇编工具链(实战核心)

1️⃣ 静态分析工具

工具 用途
objdump 基础反汇编
readelf ELF 分析
nm 符号表
strings 字符串
file 文件类型

示例:

objdump -M intel -d a.out

2️⃣ 动态调试(非常重要)

GDB(必学)

  • 断点:break
  • 单步:si / ni
  • 查看汇编:disas
  • 查看寄存器:info registers
  • 查看内存:x

✅ 推荐:

  • 《Debugging with GDB》
  • 实战:调试自己写的 C 程序

3️⃣ 进阶工具

  • Radare2 / Cutter(逆向神器)
  • IDA Pro(Linux 版)
  • Ghidra(免费、强)

建议顺序:

GDB → objdump → radare2 → Ghidra


五、学习路径(推荐顺序)

✅ 第一阶段(1–2 个月)

  • 会 Linux 基本操作
  • 会 C 语言
  • 能读懂简单 x86-64 汇编
  • 会用 objdump + gdb 分析 Hello World

目标:

能看懂 main → printf 的汇编流程


✅ 第二阶段(2–3 个月)

  • ELF 文件结构
  • 函数调用栈
  • 参数传递
  • if / for / switch 的汇编形式

目标:

能从反汇编还原 C 逻辑


✅ 第三阶段(进阶)

  • 逆向 crackme
  • 分析真实程序
  • 简单漏洞(栈溢出、ROP)
  • 去混淆、反编译对抗

六、推荐书籍(精选)

汇编 & 逆向

  • 《逆向工程核心原理》(强烈推荐)
  • 《Practical Reverse Engineering》
  • 《The Art of Assembly Language》

安全 & 底层

  • 《深入理解计算机系统(CSAPP)》(必读)
  • 《Linux 二进制分析》

七、常见误区 ❌

  • ❌ 死背汇编指令(没用)
  • ❌ 一上来就逆向大型程序
  • ❌ 忽略 C 语言
  • ❌ 只看不动手

✅ 正确方式:

写 C → 编译 → 反汇编 → 对照理解


八、你可以这样开始(今晚就能做)

  1. 写一个 C 程序:
int add(int a, int b) {
    return a + b;
}
  1. 编译:
gcc -O0 -g -fno-stack-protector main.c -o main
  1. 反汇编:
objdump -M intel -d main
  1. 用 gdb 单步执行

如果你愿意,我可以:

  • ✅ 给你 定制 30 天学习计划
  • ✅ 带你 逐行分析一段反汇编代码
  • ✅ 按 安全 / 逆向 / 内核 / 嵌入式 方向细化

你学 Linux 反汇编,是为了 逆向、安全、内核,还是兴趣?

0