参考了http://blog.csdn.net/gengzhikui1992/article/details/50829114中对一些语句的理解,对AFL的README.txt进行了总结。。
1. guided fuzzing
的挑战
Fuzzing
是漏洞挖掘领域最有效的方法之一,可以用来发现大量的远程代码执行和提权的漏洞。然而,
fuzzing
优势相对肤浅和盲目的。随机变异使得我们很难实现达到测试程序特定的代码路径。这就使得测试的代码覆盖率很低。
有很多人试图去解决这个问题,
Tavis Ormandy
曾经提出一种:语料精馏法。这个方法根据代码覆盖率,从大量高质量的输入文件语料中选取一个子集,然后按照传统方法去
fuzz
。这种方法很有效,但前提是需要一个这样的语料。另一方面,代码覆盖率只提供了一个很简单的对程序状态的描述,当
Fuzzing
测试到了一定的程度,代码覆盖率就没什么作用了。
所以,大家都在探索更复杂的技术,比如:程序控制流分析,符号执行或静态分析。这些技术在实验中是很有前途的,但是在实际应用中显得效率低下、缺乏可靠性。
2. AFL
的方案
AFL
是一个暴力方法的
fuzzer
,采用了一个极其简单但是绝对可靠的,插桩代码导向的遗传算法。
它使用
一种自定义的边缘覆盖率
来识别程序控制流的局部变化。
简单来说,整个算法的逻辑如下:
|
被选择出来的测试用例会进行周期性的删减,消除那些已经被更新的、更高覆盖率的废弃的测试用例。
整个
fuzzing
过程,会产生一个很有用的
测试
集合的语料库,可以用来对一些浏览器、
office
应用、闭源的软件等进行压力测试。
经测试,
AFL
的性能,比那些
blind fuzzing
或者
coverage-only
工具高多了。
3.
使用
AFL
插桩程序(有源码的情况下
instrument
)
当有源代码时,我们可以在编译期间进行instrument,这种instrument对性能影响很小。
gcc/g++重新编译目标程序的方法是: