git clone https://github.com/rohanpadhye/FuzzFactory
选项1:通过基于LLVM的工具进行特定领域的反馈
在根目录
make
make llvm-domains
然后
cd demo
WAYPOINTS=mem ../afl-clang-fast demo.c -o demo
../afl-fuzz -p -i seeds -o results ./demo
其余的模糊测试环节与平时运行AFL类似。按CTRL+C来停止模糊测试。在摸索过程中,会创建以下日志文件,其中有关于特定领域反馈的粗略输出:results/fuzzfactory.log。
通过LLVM仪器化的新领域
为了实现你自己的特定域的仪器化传递,让我们称它为域foo。(1) 在llvm_mode目录下创建文件waypoints-foo-pass.cc和waypoints-foo-rt.c,(2) 在根目录下运行make llvm-domains DOMAINS+=foo,(3) 在设置环境var WAYPOINTS=foo后用afl-clang-fast编译测试程序。为了帮助创建通行证和运行时文件,可以使用上一节列出的实现作为模板。
选项2:通过手动调用API进行特定领域的反馈
FuzzFactory也可用于手动增强测试程序并指定特定领域的测试目标。只需包括waypoints.h并在你的测试程序中使用以下宏。
/**
* Creates a new DSF map `name` with `size` keys, `reducer` function, and `initial` aggregate value.
*
* To be called at the top-level global scope.
*/
FUZZFACTORY_DSF_NEW(name, size, reducer, initial)
/** Set dsf[k] = max(dsf[k], v); */
FUZZFACTORY_DSF_MAX(dsf, k, v)
/** Set dsf[k] = dsf[k] | v; */
FUZZFACTORY_DSF_BIT(dsf, k, v)
/** Set dsf[k] = v; */
FUZZFACTORY_DSF_SET(dsf, k, v)
/** Set dsf[k] = dsf[k] + v; */
FUZZFACTORY_DSF_INC(dsf, k, v)