温馨提示×

如何学习linux反汇编命令

小樊
46
2026-09-12 08:31:33
栏目: 智能运维

学习 Linux 下的反汇编(disassembly)命令,建议从「工具 → 基本命令 → 实战练习 → 进阶」这样一个路径来学。下面给你一套比较系统的学习路线。


一、先搞清楚:反汇编是什么

反汇编是把 机器码(二进制) 翻译成 汇编指令 的过程,常用于:

  • 分析程序行为
  • 逆向工程
  • 漏洞分析
  • 理解编译器优化

在 Linux 下,常见场景:

  • 分析 ELF 可执行文件
  • 分析核心转储(core dump)
  • 调试运行中的程序

二、常用反汇编工具(先装这些)

1️⃣ objdump(最基础、必学)

sudo apt install binutils

2️⃣ gdb(调试 + 反汇编)

sudo apt install gdb

3️⃣ radare2 / rizin(进阶逆向)

sudo apt install radare2

4️⃣ nm / readelf(辅助分析)

sudo apt install binutils

三、最基础:objdump 反汇编命令

1️⃣ 反汇编整个可执行文件

objdump -d ./a.out

2️⃣ 反汇编指定函数

objdump -d ./a.out | grep -A 20 "<main>:"

3️⃣ 显示源代码 + 汇编(需 -g 编译)

gcc -g test.c -o test
objdump -S test

4️⃣ 查看符号表

nm ./a.out

5️⃣ 查看 ELF 结构

readelf -h ./a.out

四、用 GDB 做“动态反汇编”

1️⃣ 启动 GDB

gdb ./a.out

2️⃣ 反汇编当前函数

disassemble

3️⃣ 反汇编指定函数

disassemble main

4️⃣ 设置断点并查看汇编

break main
run
disassemble

5️⃣ 单步执行(汇编级)

stepi
nexti
info registers

五、推荐练习方式(非常重要)

✅ 练习 1:写简单 C 程序

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

编译:

gcc -g -O0 test.c -o test

反汇编:

objdump -S test

观察:

  • 函数调用
  • 栈帧(push rbp)
  • 返回值(eax)

✅ 练习 2:对比优化级别

gcc -O0 test.c -o t0
gcc -O2 test.c -o t2
objdump -d t0
objdump -d t2

你会看到:

  • O0:非常“啰嗦”
  • O2:指令少很多

✅ 练习 3:分析 shellcode / 二进制片段

echo -ne "\x90\x90\x90" > code.bin
objdump -D -b binary -m i386 code.bin

六、汇编基础(必须补)

不学汇编,反汇编看不懂。

重点学:

  • x86 / x86_64 基础指令
    • mov, add, sub, call, ret
    • push, pop
  • 寄存器
    • rax, rbx, rsp, rbp, rip
  • 调用约定(System V AMD64)

推荐资料:

  • 《Assembly Language for x86 Processors》
  • 在线:https://www.felixcloutier.com/x86/

七、进阶工具(学完基础再碰)

  • radare2 / rizin
    r2 ./a.out
    aaa
    pdf @ main
    
  • IDA Free(Linux 可用)
  • Ghidra(NSA 开源)

八、学习路线总结

C 语言
 ↓
gcc 编译过程
 ↓
ELF 文件结构
 ↓
objdump / gdb
 ↓
x86 汇编
 ↓
逆向分析实战

如果你愿意,我可以:

  • 给你 一条手把手实验清单
  • 或针对 CTF / 安全 / 内核 / 驱动 不同方向来教
  • 或直接带你 反汇编一个真实小程序

你现在是「纯新手」还是「已有 C / Linux 基础」?

0