看懂 CentOS(或 Linux 下)的反汇编代码,核心不是“看懂指令本身”,而是理解程序在做什么、为什么这样写。下面我按由浅入深 + 实战角度给你讲清楚。
在 CentOS 下,反汇编通常指:
常见工具:
objdumpgdbreadelfradare2 / IDA / Ghidra(进阶)// test.c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int x = 3;
int y = 4;
int z = add(x, y);
printf("%d\n", z);
}
编译(保留调试信息):
gcc -g -O0 -o test test.c
objdump -d test
重点看:
0000000000400526 <add>:
push rbp
mov rbp, rsp
含义:
在
-O2中可能被省略(frameless)
x86-64 Linux 规则:
| 参数 | 寄存器 |
|---|---|
| 第1个 | rdi |
| 第2个 | rsi |
| 第3个 | rdx |
| 返回值 | rax |
所以:
int add(int a, int b)
对应:
mov eax, edi
add eax, esi
✅ a + b 直接看出来了
ret
返回值在 rax 中。
if (x > 0) {
y = 1;
}
可能对应:
cmp dword ptr [rbp-4], 0
jle .L1
mov dword ptr [rbp-8], 1
.L1:
✅ 识别模式:
cmp → 比较jle / jg / je → 条件跳转你会看到:
call printf@plt
实际流程:
call → PLT → GOT → libc
✅ 不用深究 GOT 细节,只需知道这是调用库函数
syscall
常见于:
openreadwritegdb ./test
disas main
配合:
info registers
print $rax
✅ 边执行边看,比死读快 10 倍
| 阶段 | 能力 |
|---|---|
| 1 | 知道 mov/add/call/ret 是啥 |
| 2 | 能找到 main / 函数边界 |
| 3 | 能看懂参数和返回值 |
| 4 | 能还原 if / for / while |
| 5 | 能理解优化后的代码 |
objdump -d /bin/ls
gdb /bin/ls
objdump(基础)gdb(必会)radare2(进阶)看懂 CentOS 反汇编 = 理解 x86-64 ABI + 识别常见代码模式 + GDB 动态验证
如果你愿意,我可以:
你可以直接贴一段汇编出来。