读懂 CentOS 下的反汇编,核心是把“机器指令”和“Linux/CentOS 运行环境”结合起来理解。下面按从入门到实战给你一套可操作的思路。
在 CentOS 上常见反汇编对象:
常用工具:
objdump(最基础)gdbreadelfnmstrace / ltraceperfobjdump -d ./a.out
常用选项:
objdump -d -M intel ./a.out # Intel 语法(推荐)
objdump -S ./a.out # 源码+汇编对照
输出示例:
0000000000401136 <main>:
401136: 55 push rbp
401137: 48 89 e5 mov rbp,rsp
40113a: b8 00 00 00 00 mov eax,0x0
40113f: 5d pop rbp
401140: c3 ret
要点:
通用寄存器:
rax rbx rcx rdx
rsi rdi rbp rsp
r8–r15
作用(System V ABI,CentOS 用):
rdi, rsi, rdx, rcx, r8, r9:函数参数rax:返回值rsp:栈顶rbp:栈帧基址call func
等价于:
push rip
jmp func
进入函数:
push rbp
mov rbp, rsp
sub rsp, 0x10
返回:
leave
ret
nm ./a.out
readelf -s ./a.out
gcc -g -O0 main.c
objdump -S ./a.out
这样你能看到:
main():
int a = 1;
4005b6: c7 45 fc 01 00 00 00 mov DWORD PTR [rbp-0x4],0x1
gdb ./a.out
disassemble main
或:
layout asm
单步:
si # 汇编级单步
ni # 不进入函数
查看寄存器:
info registers
查看内存:
x/10x $rsp
现代 CentOS:
file ./a.out
# ELF 64-bit LSB shared object (PIE)
地址是相对地址,GDB 里才是真实运行地址。
关闭随机化:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
假设反汇编里有:
mov edi, 0x1
call puts
含义:
edi = 1 → stdoutcall puts → 输出字符串再比如:
mov rax, 0x0
syscall
→ 系统调用(CentOS 内核接口)
gcc -S 看 C → 汇编gdb 单步反汇编如果你愿意,可以:
我可以直接帮你“逐行翻译”。