📍 【基础概念 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 | 详细分析见下文 |
$ readelf -h /bin/ls
Class: ELF64, Type: DYN, Machine: x86-64
✅ 验证通过:查看ELF头
$ readelf -l /bin/ls
LOAD R, LOAD R E, LOAD R, LOAD RW
✅ 验证通过:查看Program 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) |
|---|---|---|---|
| 魔数 | \x7fELF | MZ (0x4D5A) | 0xFEEDFACE/0xFEEDFACF |
| 地址类型 | 虚拟地址 | RVA | 虚拟地址 |
| 动态链接 | GOT/PLT | Import/Export | LC_LOAD_DYLIB |
| 段对齐 | 0x1000 | 0x1000 | 0x1000(因架构而异) |
| ASLR | ET_DYN(PIE) | DLLCHAR_DYNAMIC_BASE | PIE flag |
| 术语 | 英文 | 解释 |
|---|---|---|
| 反汇编 | Disassembly | 将机器码转换为汇编语言 |
| 反编译 | Decompilation | 将机器码还原为高级语言伪代码 |
| 插桩 | Instrumentation | 运行时注入分析代码 |
| 混淆 | Obfuscation | 变换代码增加逆向难度 |
| 脱壳 | Unpacking | 去除加壳保护还原原始代码 |
| 沙箱 | Sandbox | 隔离的执行环境 |
| 符号执行 | Symbolic Execution | 用符号值分析程序路径 |
| 污点分析 | Taint Analysis | 追踪不可信数据传播 |
| ROP | Return-Oriented Programming | 利用代码片段链绕过NX |
| ASLR | Address Space Layout Randomization | 地址空间布局随机化 |
| PIE | Position-Independent Executable | 位置无关可执行文件 |
| CFG | Control Flow Graph | 控制流图 |
$ 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
Stripped binaries remove symbol table, making reverse engineering harder. Function names become addresses, variable names disappear.
逆向工程是一个庞大的知识体系,涉及计算机科学的多个领域。以下是本课涉及的核心技术领域及其关联:
| 知识领域 | 核心概念 | 与本课关联 |
|---|---|---|
| 计算机体系结构 | CPU架构、指令集、寄存器、内存层次 | 理解汇编代码的基础 |
| 操作系统 | 进程、虚拟内存、系统调用、文件系统 | 理解程序运行环境 |
| 编译原理 | 词法分析、语法树、中间表示、代码生成 | 理解编译器如何生成代码 |
| 信息安全 | 加密算法、认证机制、安全协议 | 理解保护机制和破解方法 |
| 网络协议 | TCP/IP、HTTP、DNS、TLS | 理解网络通信逆向 |
| 密码学 | 对称加密、非对称加密、哈希、数字签名 | 理解加密验证和破解 |
| 工具 | 安装 | 常用命令 | 替代方案 |
|---|---|---|---|
| objdump | apt install binutils | objdump -d/-h/-x binary | readelf, radare2 |
| GDB | apt install gdb | gdb -q ./binary; break main; run | lldb, x64dbg |
| readelf | apt install binutils | readelf -h/-l/-S/-r binary | objdump -x |
| strings | apt install binutils | strings -n 8 binary | rabin2 -z |
| strace | apt install strace | strace -f -e trace=file ./binary | ltrace, dtruss |
| Frida | pip install frida-tools | frida -n process -l hook.js | Peter, Xposed |
| Ghidra | download from GitHub | analyzeHeadless proj -import binary | IDA Pro, Binary Ninja |
| pwntools | pip install pwntools | from pwn import *; p=process('./binary') | Ropper, ROPgadget |
| checksec | apt install checksec | checksec --file=binary | readelf + objdump |
| binwalk | apt install binwalk | binwalk -e firmware.bin | firmware-mod-kit |
逆向工程的学习是渐进式的,建议按以下顺序深入:
关键原则:动手实践优于纸上谈兵。每学一个工具,立即用它分析一个真实二进制。
完成本课后,你应该能够:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| objdump报错"not an ELF file" | 文件不是ELF格式 | 先用file确认文件类型 |
| GDB无法设置断点 | 函数名被strip | 使用地址设断:break *0x401136 |
| Frida无法附加 | 权限不足或进程不存在 | 确认进程名和权限(sudo) |
| readelf找不到段 | 文件损坏或非标准格式 | 用xxd查看原始字节 |
| Ghidra分析卡住 | 二进制过大或混淆 | 限制分析范围或增加内存 |
| pwntools连接失败 | 目标未运行或端口错误 | 确认目标状态和网络配置 |
完成本课后,建议: