读懂 CentOS(或其他 Linux 平台)下的反汇编代码,本质上就是读懂 x86 / x86‑64 汇编语言 + ELF 文件结构 + 调用约定。下面我按「从入门到能看懂」的顺序给你讲。
在 CentOS 上常见反汇编对象:
file test
# test: ELF 64-bit LSB executable, x86-64
objdump -d ./test
常用参数:
objdump -d -M intel ./test # Intel 语法(推荐)
objdump -S ./test # 汇编 + 源码对照
objdump -x ./test # 查看 ELF 结构
CentOS 默认是 AT&T 语法,很多人不习惯
✅ 加-M intel更好读
gdb ./test
(gdb) disassemble main
(gdb) layout asm
查看某地址:
(gdb) x/10i $rip
radare2 / rizinIDA ProGhidrapush rbp
mov rbp, rsp
sub rsp, 0x10
含义:
参数传递顺序:
rdi, rsi, rdx, rcx, r8, r9
返回值:
rax
示例:
int foo(int a, int b)
mov edi, 1
mov esi, 2
call foo
| 指令 | 含义 |
|---|---|
mov |
赋值 |
push/pop |
栈操作 |
call |
函数调用 |
ret |
返回 |
cmp |
比较 |
je/jne |
条件跳转 |
lea |
取地址 |
xor eax,eax |
清 0 |
int add(int a, int b) {
return a + b;
}
add:
mov eax, edi
add eax, esi
ret
对应关系:
edi = aesi = beax = 返回值call printf@plt
说明:
printf 不在本程序mov rax, 1 ; write
syscall
常见 syscall 号:
✅ 先看 main,再追函数
✅ 结合 gdb 单步看寄存器变化
✅ 不要试图“读懂每一行”,先看流程
✅ 关注:跳转、调用、返回值
如果你愿意,可以:
我可以直接帮你“逐行翻译”。