学习 CentOS 下的反汇编,核心在于掌握 Linux 环境下的汇编语言、熟悉 ELF 可执行文件格式、熟练使用 GNU 工具链(GDB、objdump、readelf 等)以及理解程序运行时的内存布局。CentOS 稳定的 Linux 发行版,其底层工具与 Ubuntu 等发行版基本一致。
以下是为你定制的系统学习路径:
在 CentOS 上,你需要安装必要的开发工具包,这是反汇编的基础。
安装开发工具:
sudo yum groupinstall "Development Tools"
sudo yum install gdb nasm
gcc/g++: 编译器。gdb: 调试器(反汇编的核心工具)。nasm: 汇编器(用于编写汇编代码练习)。理解 CPU 架构:
不要直接去反汇编复杂的 C++ 程序,先学会阅读汇编。
%,立即数带 $,如 mov $5, %rax)。mov rax, 5)。set disassembly-flavor intel 切换为 Intel 语法。这是反汇编实战的关键。
学会如何生成汇编代码和查看二进制。
# 1. 编写简单的 C 代码 (test.c)
# int add(int a, int b) { return a + b; }
# int main() { return add(1, 2); }
# 2. 编译成汇编代码(人类可读)
gcc -S test.c -o test.s
# 查看 test.s,观察编译器生成的汇编
# 3. 编译成二进制并包含调试信息(非常重要)
gcc -g test.c -o test
objdump 是查看二进制文件反汇编最常用的工具。
# 反汇编整个可执行文件
objdump -d test
# 反汇编特定段(如 main 函数)
objdump -d -M intel test | grep -A 20 "<main>:"
# -M intel 使用 Intel 语法,比默认 AT&T 更易读
GDB 是最强大的学习工具,可以单步执行看寄存器变化。
gdb ./test
# 常用命令:
(gdb) set disassembly-flavor intel # 设置为 Intel 语法
(gdb) disassemble main # 查看 main 函数的汇编
(gdb) break main # 在 main 处下断点
(gdb) run # 运行
(gdb) ni # 单步执行(不进入函数)
(gdb) si # 单步执行(进入函数)
(gdb) info registers # 查看所有寄存器的值
(gdb) x/10x $rsp # 查看栈内存(10个16进制单位)
(gdb) x/10i $rip # 查看从当前指令开始的10条汇编
理解 ELF 文件格式是反汇编的前提。
readelf -h test # 查看 ELF 头
readelf -S test # 查看节头(Sections)
readelf -s test # 查看符号表
学习编译器是如何把高级语言翻译成汇编的。
if/else 对应 cmp + jcc (jump if condition)。for/while 对应 cmp + jmp 循环。switch 对应跳转表(Jump Table)。call 指令如何压栈返回地址。push rbp; mov rbp, rsp)和销毁(leave; ret)。push 是 rsp-8 然后存值,pop 是取值然后 rsp+8)比背 opcode 重要。int main() { return 0; },再反汇编带循环和函数的代码。总结路径:
安装 CentOS -> 写 C 代码 -> gcc -S 看汇编 -> objdump -d 看二进制 -> gdb 单步调试看寄存器 -> 阅读 CSAPP 第三章。