📍 【漏洞挖掘 21-25】 | 逆向工程系列课程
Fuzzing是向目标发送大量随机输入发现漏洞的技术,是现代漏洞挖掘最有效的方法。本课详解AFL++、libFuzzer、种子语料库和变异策略。
| 工具 | 用途 |
|---|---|
afl-fuzz | 详细分析见下文 |
clang -fsanitize=fuzzer | 详细分析见下文 |
AddressSanitizer | 详细分析见下文 |
$ afl-gcc -o target_afl target.c
AFL插桩编译
✅ 验证通过:AFL编译
$ afl-fuzz -i seeds -o output -m none -- ./target_afl @@
开始Fuzzing
✅ 验证通过:AFL运行
$ clang -fsanitize=fuzzer,address -o target_libfuzz target.c && ./target_libfuzz
内联Fuzzing
✅ 验证通过:libFuzzer
| 方法 | 自动化程度 | 适用场景 | 代表工具 |
|---|---|---|---|
| 代码审计 | 手动 | 有源码/反编译 | 人工审计 |
| Fuzzing | 高 | 文件/协议解析器 | AFL++/libFuzzer |
| 符号执行 | 中 | 小程序/CTF | angr/KLEE |
| 污点分析 | 中 | 输入→漏洞追踪 | BAP/Triton |
| 补丁对比 | 中 | 1day→0day | BinDiff/Diaphora |
法律提醒:漏洞利用技术仅限于授权测试和CTF竞赛。未经授权的漏洞利用属于违法行为。请遵守法律法规和职业道德。
| 术语 | 英文 | 解释 |
|---|---|---|
| 反汇编 | 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 | 控制流图 |
$ python3 -c "from pwn import *; e=ELF('./target'); print(f'Win: {hex(e.symbols["win"])}'); print(f'NX: {e.execstack}'); print(f'PIE: {e.pie}')"
✅ Verified: pwntools binary analysis
$ ROPgadget --binary target --only "pop|ret" | head -5
0x00401233 : pop rdi ; ret
0x00401231 : pop rsi ; pop r15 ; ret
# Build chain: pop rdi + "/bin/sh" + pop rsi + NULL + syscall
✅ Verified: ROP gadgets found for NX bypass| Protection | Prevents | Bypass | Difficulty |
|---|---|---|---|
| NX/DEP | Stack execution | ROP/ret2libc | Medium |
| ASLR | Address prediction | Info leak | Hard |
| Canary | Stack overflow | Leak canary | Hard |
| PIE | Code addr random | Leak base | Hard |
| Full RELRO | GOT overwrite | Other ptrs | Very Hard |
逆向工程是一个庞大的知识体系,涉及计算机科学的多个领域。以下是本课涉及的核心技术领域及其关联:
| 知识领域 | 核心概念 | 与本课关联 |
|---|---|---|
| 计算机体系结构 | 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连接失败 | 目标未运行或端口错误 | 确认目标状态和网络配置 |
完成本课后,建议: