参考/docs/perf_tips.txt
1.测试集不要过大
尽量保证测试集的大小在1KB以内,大的测试集处理起来需要花费很多时间以及内存。在/testcases/文件夹中,以及提供了很多不同类型的测试用例,可以试着去使用它们。或者在测试之前,用afl-cmin对你的测试集进行精简。
2.使用简单的目标进行测试
考虑在fuzzing过程中使用一个简单的目标二进制程序。
3.使用LLVM插桩
当目标fuzzing过程很慢时,可以使用基于LLVM的插桩技术对代码进行插桩,这样会将fuzzing速度提高2倍。
4.优化二进制程序
检查你的程序中是否有可以明显提高性能的参数或设置。例如在一个图片格式转化的工具里面,将图片转为BMP格式会比转为PNG格式快很多。有些程序里面还可能包含诸如sleep(),usleep(),nanosleep()的函数,同样会使得fuzz很慢。
还有一点,如果你正在使用ASAN并且性能不可接受,考虑将其关闭,并稍后在ASAN启用的二进制文件中手动检查生成的语料库。
5.只对需要的部分进行插桩
只对你真正需要的库文件进行插桩。如,当你测试一个加密应用时,对libgmp插桩不起到任何作用,因为它主要依赖bignum。
6.使fuzzing并行化
每个fuzzer在工作时需要一个内核,因此,在一个4核的计算机上,你可以开启4个fuzzer进程。
7.保持对内存使用与超时时间的监控
如果-m或-t限制超出了真正的需求,考虑将其重新开始。
对于名义上运行非常快,但处理某些输入时又很缓慢的程序,可以尝试设置-t值为一个比其自身使用的更强大的值。 在快速和空闲的机器上,下降到-t 5可能是一个可行的计划。
-m参数也值得一看。 一些程序最终可以花费相当多的时间用来进行发配分配和初始化兆字节的内存,当提供病理性输入时。 低的-m值可以使它们更早放弃,而不会浪费CPU时间。
8.检查操作系统的配置
有几个操作系统的因素可能会影响fuzzing速度:
系统负载高。可考虑关闭一些非必需的进程。
网络文件系统,用于fuzzer输入/输出,或由模糊二进制文件访问以读取配置文件。
CPU按需分配。分析时,低估了由afl-fuzz产生的短暂过程的需求。可通过以下命令解决:
cd /sys/devices/system/cpu echo performance | tee cpu*/cpufreq/scaling_governor
启动了透明大页(Transparent huge pages),可通过以下命令关闭它:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
次优的调度策略。解决方法:
echo 1 >/proc/sys/kernel/sched_child_runs_first echo 1 >/proc/sys/kernel/sched_autogroup_enabled
9.上述选择都失败时,使用-d选项
对于真正缓慢的程序,如果无法避免使用巨大的输入文件,或者只想在早期获得到结果,则可以随时使用-d模式。
该模式会导致afl-fuzz跳过所有确定性的模糊步骤,这使得输出不太整洁,最后的测试也不太深入,但它会给您一些比其他模糊工具更熟悉的体验。