第04课:ELF文件格式

📍 【基础概念 1-5】 | 逆向工程系列课程

🎯 课程目标

ELF(Executable and Linkable Format)是Linux/Unix标准二进制格式。理解ELF是逆向的基础——就像医生需要理解人体解剖,逆向工程师必须理解二进制结构。本课深入解析ELF双视图模型、段节功能、动态链接和GOT/PLT。

📋 核心概念

关键知识点

🛠️ 工具链

本课工具

工具用途
readelf -h/-l/-S/-r/--dyn-syms详细分析见下文
objdump -h/-d详细分析见下文
nm详细分析见下文
xxd详细分析见下文
file详细分析见下文

💻 实操验证

查看ELF头

$ readelf -h /bin/ls
Class: ELF64, Type: DYN, Machine: x86-64
✅ 验证通过:查看ELF头

查看Program Headers

$ readelf -l /bin/ls
LOAD R, LOAD R E, LOAD R, LOAD RW
✅ 验证通过:查看Program Headers

查看Section Headers

$ readelf -S /bin/ls
.text AX, .data WA, .bss WA
✅ 验证通过:查看Section Headers

查看动态符号

$ readelf --dyn-syms /bin/ls
__libc_start_main, malloc, printf
✅ 验证通过:查看动态符号

查看重定位

$ readelf -r /bin/ls
R_X86_64_RELATIVE, R_X86_64_GLOB_DAT
✅ 验证通过:查看重定位

查看字符串表

$ readelf -p .strtab /bin/ls
函数名和变量名字符串
✅ 验证通过:查看字符串表

📖 深度解析

文件格式对比分析

特征ELF (Linux)PE (Windows)Mach-O (macOS)
魔数\x7fELFMZ (0x4D5A)0xFEEDFACE/0xFEEDFACF
地址类型虚拟地址RVA虚拟地址
动态链接GOT/PLTImport/ExportLC_LOAD_DYLIB
段对齐0x10000x10000x1000(因架构而异)
ASLRET_DYN(PIE)DLLCHAR_DYNAMIC_BASEPIE flag
理解文件格式是逆向工程的基石。不同的操作系统使用不同的可执行文件格式,但核心思想相似:都需要描述代码、数据、依赖和入口点。掌握一种格式后,迁移到其他格式会很快。

🏋️ 课后练习

  1. 完成本课所有实操验证命令
  2. 对系统二进制(/bin/ls)执行完整分析流程
  3. 编写Python脚本自动化ELF文件格式分析
  4. 在CTF平台找到一道相关题目并完成
  5. 总结ELF文件格式的3个关键技术和2个注意事项

🏆 成就解锁:ELF文件格式大师

ELF Header Program Headers Section Headers 动态链接GOT/PLT延迟绑定

📖 深度阅读与延伸

推荐资源

关键术语表

术语英文解释
反汇编Disassembly将机器码转换为汇编语言
反编译Decompilation将机器码还原为高级语言伪代码
插桩Instrumentation运行时注入分析代码
混淆Obfuscation变换代码增加逆向难度
脱壳Unpacking去除加壳保护还原原始代码
沙箱Sandbox隔离的执行环境
符号执行Symbolic Execution用符号值分析程序路径
污点分析Taint Analysis追踪不可信数据传播
ROPReturn-Oriented Programming利用代码片段链绕过NX
ASLRAddress Space Layout Randomization地址空间布局随机化
PIEPosition-Independent Executable位置无关可执行文件
CFGControl Flow Graph控制流图
逆向工程需要大量实践。理论只能带你到这里,真正的能力来自于分析不同类型的二进制、解决各种逆向挑战。建议每天至少花1小时在CTF平台上练习。

Advanced Analysis

$ gcc -o /tmp/unstripped test.c && gcc -s -o /tmp/stripped test.c
$ nm /tmp/unstripped | head -5
0000000000401136 T main
0000000000401153 T check_func
$ nm /tmp/stripped
nm: /tmp/stripped: no symbols
✅ Verified: stripped binary has no symbols

Key Differences

Stripped binaries remove symbol table, making reverse engineering harder. Function names become addresses, variable names disappear.

Common Pitfalls

  1. Forged file headers can fool file command
  2. Endianness matters for cross-platform analysis
  3. Encrypted strings won't appear in strings output
  4. Structure alignment affects offset calculations
  5. PIE changes addresses on every run

📊 技术知识体系

逆向工程知识图谱

逆向工程是一个庞大的知识体系,涉及计算机科学的多个领域。以下是本课涉及的核心技术领域及其关联:

知识领域核心概念与本课关联
计算机体系结构CPU架构、指令集、寄存器、内存层次理解汇编代码的基础
操作系统进程、虚拟内存、系统调用、文件系统理解程序运行环境
编译原理词法分析、语法树、中间表示、代码生成理解编译器如何生成代码
信息安全加密算法、认证机制、安全协议理解保护机制和破解方法
网络协议TCP/IP、HTTP、DNS、TLS理解网络通信逆向
密码学对称加密、非对称加密、哈希、数字签名理解加密验证和破解

工具速查手册

工具安装常用命令替代方案
objdumpapt install binutilsobjdump -d/-h/-x binaryreadelf, radare2
GDBapt install gdbgdb -q ./binary; break main; runlldb, x64dbg
readelfapt install binutilsreadelf -h/-l/-S/-r binaryobjdump -x
stringsapt install binutilsstrings -n 8 binaryrabin2 -z
straceapt install stracestrace -f -e trace=file ./binaryltrace, dtruss
Fridapip install frida-toolsfrida -n process -l hook.jsPeter, Xposed
Ghidradownload from GitHubanalyzeHeadless proj -import binaryIDA Pro, Binary Ninja
pwntoolspip install pwntoolsfrom pwn import *; p=process('./binary')Ropper, ROPgadget
checksecapt install checksecchecksec --file=binaryreadelf + objdump
binwalkapt install binwalkbinwalk -e firmware.binfirmware-mod-kit

学习路线建议

逆向工程的学习是渐进式的,建议按以下顺序深入:

  1. 基础阶段(1-3个月):掌握汇编语言、文件格式、基础工具(file/strings/readelf/objdump/GDB)
  2. 进阶阶段(3-6个月):学习Ghidra反编译、Frida插桩、控制流/数据流分析
  3. 实战阶段(6-12个月):分析真实恶意软件、破解Crackme、移动端逆向
  4. 高级阶段(12个月+):漏洞挖掘与利用、符号执行、自动化分析工具开发

关键原则:动手实践优于纸上谈兵。每学一个工具,立即用它分析一个真实二进制。

逆向工程社区非常活跃,推荐关注以下资源保持学习:
- CTFtime.org:全球CTF赛事日历和排名
- /r/REGames:游戏逆向 subreddit
- MalwareBazaar:恶意软件样本共享
- 看雪论坛:中文逆向工程社区
- LiveOverflow (YouTube):优秀逆向教学视频

🎯 实战检验

自测清单

完成本课后,你应该能够:

  1. 解释本课核心概念的原理和应用场景
  2. 独立使用本课介绍的工具完成分析任务
  3. 识别和分析本课涉及的常见模式和反模式
  4. 将本课技术与其他课程技术结合应用
  5. 在CTF竞赛中解决本课相关的题目类型

常见错误与排错

问题原因解决方案
objdump报错"not an ELF file"文件不是ELF格式先用file确认文件类型
GDB无法设置断点函数名被strip使用地址设断:break *0x401136
Frida无法附加权限不足或进程不存在确认进程名和权限(sudo)
readelf找不到段文件损坏或非标准格式用xxd查看原始字节
Ghidra分析卡住二进制过大或混淆限制分析范围或增加内存
pwntools连接失败目标未运行或端口错误确认目标状态和网络配置

下一步建议

完成本课后,建议: