其他
模糊测试覆盖率停滞时用字典引导 fuzzer…
在对解析器、协议或文件格式做模糊测试且覆盖率卡在输入校验时,构建并接入 fuzzing 字典让 fuzzer 生成目标期望的关键字、魔数和 token。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 48/100 ×0.15
适用场景
模糊测试覆盖率停滞时用字典引导 fuzz通用
解决思路
- 创建字典文本文件,每行一个带引号的字符串或键值对,用 # 写注释,空行忽略;用 \\ 表示反斜杠、\" 表示引号、\xAB 表示十六进制字节。
- 用 LLM 生成字典内容:提示 ChatGPT 或 Claude 为指定目标(如 PNG parser)编写字典文件,每行为引号字符串或 kw="value" 形式,包含魔数、chunk 类型和常见头部值,二进制值用 \xF7\xF8 这类十六进制转义。
- 从头文件提取 token:grep -o '".*"' header.h > header.dict。
- 从 man page 提取 CLI 选项:man curl | grep -oP '^\s*(--|-)\K\S+' | sed 's/[,.]$//' | sed 's/^/"/; s/$/&"/' | sort -u > man.dict。
- 从二进制提取字符串:strings ./binary | sed 's/^/"/; s/$/&"/' > strings.dict。
- 把字典传给 fuzzer:libFuzzer 用 ./fuzz -dict=./dictionary.dict ...,AFL++ 用 afl-fuzz -x ./dictionary.dict ...,cargo-fuzz 用 cargo fuzz run fuzz_target -- -dict=./dictionary.dict。
- 为协议类目标加入协议关键字,如 HTTP 方法 GET/POST/PUT/DELETE/HEAD、头部 Content-Type/Authorization/Host、协议标记 HTTP/1.1/HTTP/2.0。
- 为文件格式类目标加入魔数与格式头,如 PNG 的 png_magic="\x89PNG\r\n\x1a\n"、ihdr="IHDR"、plte="PLTE"、idat="IDAT"、iend="IEND",JPEG 的 jpeg_soi="\xFF\xD8"、jpeg_eoi="\xFF\xD9"。
- 为配置文件解析器加入配置关键字,如 true/false/null/version/enabled/disabled 以及 [general]/[network]/[security] 等节头。
- 组合多种生成方式:LLM 生成的关键字加上从二进制提取的字符串,覆盖更广的输入面。
- 加入边界值如 "0"、"-1"、"2147483647" 以触发边界情况。
- 加入格式分隔符如 :、=、{、} 帮助 fuzzer 构造合法结构。
- 保持字典聚焦,50-200 条效果优于数千条。
- 验证字典有效性:分别在带字典和不带字典的情况下运行,比较覆盖率。
- 使用 afl-clang-lto 时启用自动字典:export AFL_LLVM_DICT2FILE=auto.dict,然后 afl-clang-lto++ target.cc -o target,字典会保存到 auto.dict,再用 afl-fuzz -x auto.dict -i in -o out -- ./target 运行。
- 组合多个字典文件:AFL++ 支持多个 -x,如 afl-fuzz -x keywords.dict -x formats.dict -i in -o out -- ./target。
- libFuzzer 集成:字典 token 在变异时被插入或替换,可配合 -max_len 控制输入大小,用 -print_final_stats=1 查看字典有效性指标,超过 -max_len 的条目会被忽略。
- AFL++ 集成:支持多个 -x 字典,配合 afl-clang-lto 用 AFL_LLVM_DICT2FILE 自动生成字典,字典有效性在统计 UI 中显示,token 在确定性阶段和 havoc 阶段都会被使用。
- cargo-fuzz 集成:使用 libFuzzer 后端,所有 libFuzzer 字典参数均可用,把字典文件放在 fuzz/ 目录,从 harness 目录引用为 -dict=../dictionary.dict。
- go-fuzz 无内置字典支持,可手动把字典条目转成语料文件:grep -o '".*"' dict.txt | while read line; do echo -n "$line" | base64 > corpus/$(echo "$line" | md5sum | cut -d' ' -f1); done,再运行 go-fuzz -bin=./target-fuzz.zip -workdir=.。
- 排查字典未加载:检查 fuzzer 输出中的字典解析错误并确认文件格式。
- 排查无覆盖率提升:分析目标代码中真正的关键字,换用其他生成方式。
- 排查字典语法错误:用 \\ 表示反斜杠、\" 表示引号,并通过试运行验证。
- 排查 fuzzer 忽略长条目:保持条目不超过最大输入长度,或增大 -max_len。
- 排查条目过多拖慢 fuzzer:裁剪到 50-200 条最相关的条目。
适用边界 · 注意事项
- 模糊测试没有格式预期的纯算法时
- 目标不存在基于关键字的解析时
- 语料库已经达到高覆盖率时