温馨提示×

如何读懂centos反汇编指令

小樊
43
2026-09-15 07:23:03
栏目: 智能运维

读懂 CentOS(本质就是 Linux x86/x64)上的反汇编指令,核心是先了解汇编语法、寄存器、调用约定,再结合工具(如 objdump、gdb)去看。下面从基础到实战一步步讲。


一、先搞清楚:反汇编是什么

反汇编是把 机器码(二进制) 转成 汇编指令 给人看。

CentOS 常见:

  • x86(32 位)
  • x86_64(64 位,最常见)

反汇编工具:

objdump -d 程序
gdb 程序
(gdb) disassemble

二、两种常见汇编语法(很重要)

1. AT&T 语法(objdump 默认)

mov %rsp, %rbp

特点:

  • 源在前,目的在后
  • 寄存器加 %
  • 立即数加 $
  • 有大小后缀(b/w/l/q)

2. Intel 语法(gdb 可切换)

mov rbp, rsp

特点:

  • 目的在前,源在后
  • 更像 Windows 汇编

切换 gdb 到 Intel:

set disassembly-flavor intel

三、必须认识的寄存器(x86_64)

通用寄存器

寄存器 作用
rax 返回值 / 计算
rbx 通用
rcx 第 4 参数
rdx 第 3 参数
rsi 第 2 参数
rdi 第 1 参数
rbp 栈帧基址
rsp 栈指针
r8–r15 额外参数

段 / 标志

  • rip:指令指针(PC)
  • eflags:状态标志(ZF、CF 等)

四、函数调用约定(System V AMD64)

Linux/CentOS 使用:

参数顺序:

rdi, rsi, rdx, rcx, r8, r9

第 7 个参数开始用栈。

返回值:

  • rax

栈:

  • 函数入口常见:
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

六、一个真实例子(C → 汇编)

C 代码

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 = a
  • esi = b
  • eax = edi
  • eax += esi
  • 返回 eax

七、怎么“读懂”一段反汇编

建议顺序:

  1. 找 main 或函数入口
  2. 看 rbp/rsp 建立栈帧
  3. 找 call 调用
  4. 看参数寄存器
  5. 看 cmp + jmp 控制流
  6. 看 ret 返回

八、实用技巧

1. 反汇编指定函数

objdump -d a.out | grep -A20 "<main>:"

2. gdb 动态看

gdb ./a.out
break main
run
disassemble
stepi
info registers

3. 看符号

nm a.out
readelf -s a.out

九、学习路线建议

  1. 学 x86_64 汇编基础
  2. 写 C → 看汇编对照
  3. 用 gdb 单步执行
  4. 读简单程序(hello、calc)

如果你愿意,可以:

  • 发一段 CentOS 反汇编代码
  • 或告诉我你是 逆向 / 调试 / 学底层 / 面试题

我可以直接带你一行一行读。

0 踩