温馨提示×

如何看懂CentOS反汇编

小樊
47
2026-08-04 09:03:58
栏目: 智能运维

看懂 CentOS(或 Linux 下)的反汇编代码,核心不是“看懂指令本身”,而是理解程序在做什么、为什么这样写。下面我按由浅入深 + 实战角度给你讲清楚。


一、先明确:你在看什么?

在 CentOS 下,反汇编通常指:

  • x86 / x86-64 汇编
  • 来自 ELF 可执行文件 / 共享库
  • gcc / g++ 编译
  • 可能经过 优化(-O2)

常见工具:

  • objdump
  • gdb
  • readelf
  • radare2 / IDA / Ghidra(进阶)

二、从“能看懂”的最小目标开始

✅ 目标不是背指令,而是看懂三件事:

  1. 函数调用关系
  2. 参数和返回值
  3. 关键逻辑(判断 / 循环 / 内存访问)

三、CentOS 下反汇编基本流程

1️⃣ 编译一个示例程序

// 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

2️⃣ 反汇编(objdump)

objdump -d test

重点看:

0000000000400526 <add>:

四、x86-64 汇编“速读法则”

✅ 1. 函数开头(栈帧)

push   rbp
mov    rbp, rsp

含义:

  • 保存调用者的栈帧
  • 建立当前函数栈帧

-O2 中可能被省略(frameless)


✅ 2. 参数传递(System V ABI)

x86-64 Linux 规则:

参数 寄存器
第1个 rdi
第2个 rsi
第3个 rdx
返回值 rax

所以:

int add(int a, int b)

对应:

mov    eax, edi
add    eax, esi

a + b 直接看出来了


✅ 3. 返回值

ret

返回值在 rax 中。


五、如何“看懂”一段反汇编(实例)

示例:反汇编中的 if

if (x > 0) {
    y = 1;
}

可能对应:

cmp    dword ptr [rbp-4], 0
jle    .L1
mov    dword ptr [rbp-8], 1
.L1:

✅ 识别模式:

  • cmp → 比较
  • jle / jg / je → 条件跳转
  • 跳转目标 → 分支

六、CentOS / Linux 特有注意点

1️⃣ PLT / GOT(动态链接)

你会看到:

call   printf@plt

实际流程:

call → PLT → GOT → libc

不用深究 GOT 细节,只需知道这是调用库函数


2️⃣ 系统调用(很少直接看)

syscall

常见于:

  • open
  • read
  • write

七、用 GDB 辅助“看懂反汇编”

gdb ./test
disas main

配合:

info registers
print $rax

边执行边看,比死读快 10 倍


八、从“看不懂”到“能看懂”的 5 个阶段

阶段 能力
1 知道 mov/add/call/ret 是啥
2 能找到 main / 函数边界
3 能看懂参数和返回值
4 能还原 if / for / while
5 能理解优化后的代码

九、推荐学习路径(CentOS 实战)

✅ 入门

  • 《汇编语言(基于 Linux)》
  • 《逆向工程核心原理》(前半部分)

✅ 实战

objdump -d /bin/ls
gdb /bin/ls

✅ 工具

  • objdump(基础)
  • gdb(必会)
  • radare2(进阶)

十、一句话总结

看懂 CentOS 反汇编 = 理解 x86-64 ABI + 识别常见代码模式 + GDB 动态验证

如果你愿意,我可以:

  • ✅ 帮你 逐行分析一段真实反汇编
  • ✅ 对比 -O0 / -O2 编译差异
  • ✅ 教你 从反汇编还原 C 代码
  • ✅ 针对 内核 / glibc / exploit 场景

你可以直接贴一段汇编出来。

0