温馨提示×

Linux反汇编注意啥

小樊
56
2026-08-20 07:21:33
栏目: 智能运维

在 Linux 下进行反汇编(disassembly)和逆向分析时,有几个关键点和常见坑需要注意。下面从工具链、二进制格式、架构、符号与调试信息、安全机制、实战习惯等方面系统说明。


一、了解 Linux 下的二进制格式

1. ELF 是核心

Linux 可执行文件大多是 ELF(Executable and Linkable Format)
重点关注:

  • .text:代码段(反汇编的主要对象)
  • .data / .rodata:全局变量、字符串
  • .plt / .got:动态链接相关(函数跳转)
  • .init / .fini:初始化与析构逻辑

工具查看:

readelf -h a.out
readelf -S a.out

二、选择合适的反汇编工具

常用工具对比

工具 特点
objdump 基础、稳定、适合脚本
gdb 动态调试 + 反汇编
radare2 / r2 强大、学习曲线陡
IDA Pro 图形化、商业
Ghidra 免费、支持反编译
capstone 库,适合自己写工具

示例:

objdump -d a.out
gdb a.out
(gdb) disas main

三、注意架构与指令集

1. x86 vs x86-64

  • x86(32位)
    • 参数通过栈传递
    • cdecl / stdcall
  • x86-64
    • 参数通过寄存器:rdi, rsi, rdx, rcx, r8, r9
    • 栈帧结构不同
file a.out
# ELF 64-bit LSB executable, x86-64

四、区分反汇编 vs 反编译

  • 反汇编:汇编指令(asm)
  • 反编译:伪 C 代码

⚠️ 注意:

  • 反编译是“猜测”,不一定准确
  • 优化后的代码(O2/O3)很难看懂

五、注意编译器优化影响

常见现象

  • 函数被 inline
  • 变量被优化掉
  • 控制流被重排
  • 尾调用优化

建议:

gcc -O0 -g -o test test.c

关闭优化,方便学习。


六、符号与调试信息

1. 有无符号差别巨大

nm a.out
  • 有符号:函数名、变量名清晰
  • strip 后:只剩地址

2. debug 信息

objdump -d -M intel a.out

GDB 中:

info functions
info variables

七、动态链接与 PLT/GOT

Linux 大量使用动态库:

  • PLT(Procedure Linkage Table)
  • GOT(Global Offset Table)

反汇编时常见:

call    puts@plt

⚠️ 注意:

  • 不能直接看到 libc 函数实现
  • 需要运行时解析地址

八、常见安全机制会影响分析

1. ASLR(地址随机化)

cat /proc/sys/kernel/randomize_va_space
  • 0:关闭
  • 2:全开(默认)

调试时可临时关闭:

setarch $(uname -m) -R ./a.out

2. DEP / NX

  • 数据段不可执行
  • 影响 shellcode 分析

3. Stack Canary

  • 栈溢出检测
  • 反汇编时能看到 __stack_chk_fail

4. PIE

  • 可执行文件本身地址随机化
  • 分析时更依赖偏移而非绝对地址

九、系统调用与 ABI

Linux 特有:

  • syscall
  • x86-64 syscall 使用:
    • rax:系统调用号
    • rdi, rsi, rdx...:参数

参考:

man 2 syscall

十、实战好习惯

✅ 推荐做法:

  • file / readelf 再看汇编
  • 先静态分析,再动态调试
  • 保存函数偏移、地址备注
  • 学会看调用约定
  • 写注释、画调用图

❌ 常见坑:

  • 只看反编译结果
  • 忽视 ABI 和调用约定
  • 不懂 ELF 结构就硬逆
  • 没注意 32/64 位差别

十一、学习建议路径

  1. 熟悉 x86/x86-64 汇编
  2. 理解 ELF 结构
  3. 熟练 objdump + gdb
  4. 分析 简单 C 程序
  5. 逐步接触 PLT/GOT、libc、堆/栈

如果你愿意,我可以:

  • 给你一份 Linux 反汇编速查表
  • 手把手 对照 C 和汇编
  • CTF / 逆向实战案例
  • 专门讲 ARM / RISC-V 反汇编

你现在是学习阶段、做安全、还是调试问题

0