温馨提示×

怎样读懂centos反汇编

小樊
47
2026-09-30 07:46:26
栏目: 智能运维

读懂 CentOS 下的反汇编,核心是把“机器指令”和“Linux/CentOS 运行环境”结合起来理解。下面按从入门到实战给你一套可操作的思路。


一、先明确你在反汇编什么

在 CentOS 上常见反汇编对象:

  1. ELF 可执行文件 / 动态库
    • 编译后的 C/C++ 程序
  2. 内核模块(.ko)
  3. 崩溃现场(core dump)
  4. 运行中的进程(/proc/pid/…)

常用工具:

  • objdump(最基础)
  • gdb
  • readelf
  • nm
  • strace / ltrace
  • perf

二、基础:从 objdump 开始

1. 反汇编整个文件

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

要点:

  • 左边:地址
  • 中间:机器码
  • 右边:汇编指令

三、理解 x86-64 基础(CentOS 常见)

1. 寄存器(最重要)

通用寄存器:

rax rbx rcx rdx
rsi rdi rbp rsp
r8–r15

作用(System V ABI,CentOS 用):

  • rdi, rsi, rdx, rcx, r8, r9:函数参数
  • rax:返回值
  • rsp:栈顶
  • rbp:栈帧基址

2. 函数调用流程

call func

等价于:

push rip
jmp func

进入函数:

push rbp
mov rbp, rsp
sub rsp, 0x10

返回:

leave
ret

四、结合符号和调试信息

1. 查看符号

nm ./a.out
readelf -s ./a.out

2. 有调试信息更好

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 读反汇编(最实用)

1. 启动调试

gdb ./a.out

2. 查看反汇编

disassemble main

或:

layout asm

单步:

si    # 汇编级单步
ni    # 不进入函数

查看寄存器:

info registers

查看内存:

x/10x $rsp

六、CentOS 特有注意点

1. ABI 是 System V

  • 参数用寄存器
  • 栈 16 字节对齐

2. PIE / ASLR

现代 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 → stdout
  • call puts → 输出字符串

再比如:

mov rax, 0x0
syscall

→ 系统调用(CentOS 内核接口)


八、推荐学习路径

  1. 先学 x86-64 汇编基础
  2. 用 gcc -S 看 C → 汇编
  3. 用 gdb 单步反汇编
  4. 读 ELF 结构
  5. 分析真实程序 / core dump

如果你愿意,可以:

  • 发一段 CentOS 反汇编代码
  • 或说明你是 看漏洞 / 学内核 / 逆向程序

我可以直接帮你“逐行翻译”。

0 踩