读懂 CentOS(本质就是 Linux x86/x64)上的反汇编指令,核心是先了解汇编语法、寄存器、调用约定,再结合工具(如 objdump、gdb)去看。下面从基础到实战一步步讲。
反汇编是把 机器码(二进制) 转成 汇编指令 给人看。
CentOS 常见:
反汇编工具:
objdump -d 程序
gdb 程序
(gdb) disassemble
mov %rsp, %rbp
特点:
%$b/w/l/q)mov rbp, rsp
特点:
切换 gdb 到 Intel:
set disassembly-flavor intel
| 寄存器 | 作用 |
|---|---|
| rax | 返回值 / 计算 |
| rbx | 通用 |
| rcx | 第 4 参数 |
| rdx | 第 3 参数 |
| rsi | 第 2 参数 |
| rdi | 第 1 参数 |
| rbp | 栈帧基址 |
| rsp | 栈指针 |
| r8–r15 | 额外参数 |
rip:指令指针(PC)eflags:状态标志(ZF、CF 等)Linux/CentOS 使用:
参数顺序:
rdi, rsi, rdx, rcx, r8, r9
第 7 个参数开始用栈。
返回值:
栈:
push rbp
mov rbp, rsp
sub rsp, 0x10
mov rax, rbx ; rax = rbx
mov rax, [rbp-8] ; 从栈读
mov [rbp-8], rax ; 写回栈
add rax, 1
sub rax, rbx
imul rax, rbx
cmp rax, rbx
je label ; 相等跳
jne label ; 不等跳
jg label ; 大于
jl label ; 小于
call func
ret
int add(int a, int b) {
return a + b;
}
add:
push rbp
mov rbp, rsp
mov eax, edi
add eax, esi
pop rbp
ret
解读:
edi = aesi = beax = edieax += esi建议顺序:
main 或函数入口rbp/rsp 建立栈帧call 调用cmp + jmp 控制流ret 返回objdump -d a.out | grep -A20 "<main>:"
gdb ./a.out
break main
run
disassemble
stepi
info registers
nm a.out
readelf -s a.out
如果你愿意,可以:
我可以直接带你一行一行读。