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)
使用Clang的演示
本节假设你已经安装了LLVM/Clang,并且在根目录下运行了make llvm-domains。
要从一个测试程序中看到这些宏的使用示例,请cd到demo目录并运行以下程序。
diff demo.c demo-manual.c # 比较演示程序和fuzzfactory-macro增强的测试程序
编译增强的测试程序,如下所示。
../afl-clang-fast demo-manual.c -o demo-manual
使用-p选项对增强后的测试程序进行模糊处理,以启用特定领域的模糊处理。
../afl-fuzz -p -i seeds/ -o results ./demo-manual
在启用cmp和mem两个航点的情况下,对增强的程序进行模糊处理与对原始演示程序的模糊处理类似。同样,你会看到这样的输出。
[+] 1 domain-specific front-end configs received
DSF 0: Start=0x000000, End=0x000004, Size=4, Reducer[0]=0x55a947da28f0, Initial=0
以及AFL状态屏幕的开始。