--- name: re-vuln type: gateway description: > 漏洞挖掘网关。编排:目标与输入面识别 → 覆盖率引导 fuzzing → 崩溃分析 → 逆向定位 → 报告。 子技能:[[re-fuzzing]] [[re-crash-triage]] [[re-exploit]]。 触发词:漏洞挖掘、挖洞、fuzz、模糊测试、AFL、libFuzzer、崩溃分析、 crash、vulnerability hunting、fuzzing。 capabilities: [fuzzing, symbolic-execution, constraint-solving] --- # 漏洞挖掘(覆盖率引导 fuzzing / 崩溃定位) ## 完整工作流 按顺序执行;每步产物(目标/输入面结论、fuzz 运行目录、崩溃样本、定位证据)记录证据路径 + sha256(存证方法见 [[re-triage]](能力:`triage`)),供报告引用。 1. **目标与输入面识别** —— 先弄清"fuzz 什么、输入从哪进"(见坑 1): - 目标形态:本地文件解析(图像/压缩/文档/自定义格式)、网络服务(监听端口收包)、库函数(被调用的解析 API)、命令行工具(argv/stdin) - 输入面:fuzz 输入通道(文件 / 文件内容 / 网络包 / stdin / argv)与解析入口函数 - 初勘:`file` / `strings` / 熵 / checksec([[re-triage]](能力:`triage`));静态定位解析入口([[re-binary-core]](能力:`decompilation`、`debugging`、`memory-dump`、`elf-parser`、`pe-parser`、`macho-parser`) 底座,[[re-ghidra]](能力:`decompilation`、`debugging`) 反编译找主处理函数) - 决策:fuzz 引擎与插桩方式(源码可插桩 / 无源码 QEMU 模式),见「选择树」 2. **覆盖率引导 fuzzing → [[re-fuzzing]](能力:`fuzzing`)** —— 插桩 + 语料 + 跑起来: - 源码可用:AFL++ 编译器包装器 + ASAN 构建(`afl-clang-fast -fsanitize=address`);库函数写 harness;无源码 `-Q`(QEMU 模式) - 初始化语料(最小有效样本,`afl-cmin` 去重),`afl-fuzz` 多实例跑(`-M main` / `-S secondary`) - 覆盖率监控(afl-cov / afl-whatsup),观察 paths 增长;加字典 / 结构化输入提速 3. **崩溃分析 → [[re-crash-triage]](能力:`debugging`)** —— 出现 crash 立即处理: - 确定性复现(同一输入重跑必崩);ASAN 报告解读(堆溢出 / 越界 / UAF / double-free) - 输入最小化(afl-tmin / afl-cmin)→ 最小 PoC - 非确定性崩溃用 rr 录制重放 4. **逆向定位([[re-binary-core]](能力:`decompilation`、`debugging`、`memory-dump`、`elf-parser`、`pe-parser`、`macho-parser`) 底座)** —— 把崩溃翻译成漏洞根因: - [[re-triage]](能力:`triage`):崩溃输入 sha256 存证 + 目标基线记录 - [[re-ghidra]](能力:`decompilation`、`debugging`;或 [[re-ida]](能力:`decompilation`、`debugging`) / [[re-radare2]](能力:`decompilation`)):gdb 回溯栈中无符号帧用反编译补(见坑 5);定位崩溃函数与输入数据流向 - 确认:越界/悬垂发生在哪段逻辑、输入是否可控、路径是否真实可达(见坑 3) - 崩溃 core(进程已死 / 已有 core dump)→ [[re-memdump]](能力:`memory-dump`) 分析 5. **报告**: - 记录:崩溃类型、复现命令、最小 PoC(文件 + sha256)、根因(函数/行/偏移)、可达性分析、影响(越界读/写、RCE/DoS)、修复建议 - 产出:PoC / 崩溃特征可进 [[re-ioc]](能力:`threat-intel`) ## 何时用哪个原子技能(选择树) 按目标输入形态 / 当前状态分支: - **本地文件解析**(输入是一个文件:图像/压缩/文档/自定义格式解析器)→ [[re-fuzzing]](能力:`fuzzing`) 用 **AFL++**(源码插桩 + ASAN;无源码 `-Q` QEMU 模式) - **库函数**(目标是库的 API,如 libpng 的 `png_read_*`、自定义 parser 函数)→ [[re-fuzzing]](能力:`fuzzing`) 用 **libFuzzer**(`-fsanitize=fuzzer,address` + fuzz target harness),或 AFL++ 持久模式 harness - **网络服务**(监听端口、协议解析)→ 网络 fuzz:[[re-netcap]](能力:`network-capture`) 抓真实流量做种子,写 harness 重放喂解析函数(见 [[re-fuzzing]](能力:`fuzzing`) 坑 5);fuzz 的是解析器不是网络栈 - **已有崩溃 / 崩溃输入**(无需重跑 fuzz)→ 直接 [[re-crash-triage]](能力:`debugging`):确定性复现 → 最小化 → 定位 - **崩溃已定位、要读函数逻辑** → [[re-binary-core]](能力:`decompilation`、`debugging`、`memory-dump`、`elf-parser`、`pe-parser`、`macho-parser`) 底座([[re-ghidra]](能力:`decompilation`、`debugging`) / [[re-ida]](能力:`decompilation`、`debugging`) / [[re-radare2]](能力:`decompilation`)) - **崩溃是 core 文件**(进程已死)→ [[re-memdump]](能力:`memory-dump`) 分析 core,再按需逆向 - **目标无输入解析(纯算法/纯逻辑)** → fuzz 不适合,符号执行更优([[re-angr]](能力:`symbolic-execution`) / [[re-z3]](能力:`constraint-solving`)) ## 跨域联合 - **底座 [[re-binary-core]]**:第 4 步逆向定位固定调用([[re-triage]] 初勘与存证 / [[re-ghidra]] 反编译定位 / [[re-ida]] / [[re-radare2]]);本网关 ①-⑤ 的静态环节都落在底座技能上(规格 2.4:崩溃样本定位 = re-vuln → re-binary-core + re-memdump) - **崩溃 core → [[re-memdump]]**:进程已死 / 已有 core dump 时,崩溃样本分析走内存转储与 core 提取 - **CTF pwn → [[re-ctf]]**:pwn 赛题的 fuzzing / 崩溃分析交本网关;赛题二进制同样适用本网关流程 - **动态执行沙箱**:fuzz / 复现崩溃都是动态执行,默认在 [[re-sandbox]] 内跑([[re-analyze/platform-tips]] 最高原则) - **网络目标**:[[re-netcap]] 抓包做种子语料与输入面确认 - **入口调度**:本网关由 [[re-analyze]] 按触发词分派(漏洞挖掘 / fuzz / 崩溃分析),triage 已显式接线 - **产出**:PoC hash / 崩溃特征 / 漏洞指纹可进 [[re-ioc]] ## 常见坑与陷阱 - **目标/输入面识别不到位就开跑**:现象——fuzz 跑几天零崩溃,或崩溃全在无关代码;原因——输入通道/解析入口不对(如把网络程序当文件解析器 fuzz,核心解析逻辑没被覆盖);对策——第 1 步先静态确认解析入口([[re-ghidra]] 反编译找主处理函数),harness 直连解析函数,[[re-netcap]] 抓真实流量验证输入面 - **崩溃≠漏洞**:现象——ASAN 报的越界/UAF 在死代码分支,或崩溃由 harness 自身引入;原因——fuzzer 能触发不等于真实可达、可利用;对策——[[re-crash-triage]] 第 4 步 gdb 回溯 + [[re-binary-core]] 反编译确认崩溃路径真实可达、输入可控;区分 harness bug 与目标 bug - **无插桩无覆盖率**:现象——execs 涨得飞快但 paths 不动、从不出新崩溃;原因——目标没插桩(release 二进制、参数写错 fuzz 了无关程序);对策——[[re-fuzzing]] 用 `afl-showmap` 验证覆盖率变化,无源码改用 `-Q` QEMU 模式 - **崩溃去重缺失**:现象——同一个 bug 的上万个 crash 文件淹没分析;原因——每个变异输入都存盘,未按崩溃点区分;对策——afl-tmin 最小化 + 按 ASAN 类型/回溯栈合并(见 [[re-crash-triage]]) - **符号缺失定位难**:现象——gdb `bt` 全是 `??`;原因——剥离符号/静态链接;对策——记录模块基址与偏移,用 [[re-ghidra]] 反编译补帧([[re-binary-core]] 底座)