最近阅读了国外一个博主的https://h0mbre.github.io/Fuzzing-Like-A-Caveman/,Fuzzing like a Caveman,这个内容很有意思,从最开始的一无所有尝试写出一个模糊测试工具,并不断进行优化。作为一个Fuzzing小白,总结一下原作者的内容。
Part1
选择exif文件解析器作为Fuzzing对象,首先介绍了一些jpeg文件的知识。
最开始使用Python语言,第一步完成一个读文件的函数get_byte(),打印文件,其实文件的本质还是2进制数。然后写了一个字节翻转bit_flip函数。
字节翻转可以说是最简单的变异策略。然后又写了一个魔术数字替换的变异函数。最终实现了一个非常简易的模糊测试器。
之后用到了Asan作为内存检测工具来发现段错误。
Part2
第二阶段没有尝试对测试用例生成算法进行改进,而是尝试优化程序代码以提升模糊器的效率。
利用Python模块cProfile对程序各部分运行时间做统计,优化函数实现,尝试通过不同库、方法实现。这是提升效率的第一种方式。
然后将语言变为C++实现,C++模糊器在速度上又取得了提升。
Part3
第三阶段引入代码覆盖率,作者简单写了一个有校验的模拟测试程序,让读者体会代码覆盖率方法是如何在模糊测试中发挥作用的。
Part4
作者分析C语言实现中,在打开文件前,程序就做了很多的系统调用,每一次测试迭代了多次系统调用,用fork()+execvp()执行过程。
引入快照机制节约时间,提升效率。这部分内容还需要细看,使用了一些没见过的库和方法,下断点,捕获快照。
Part5
这部分重点讲述覆盖率数据的种类,覆盖率数据的获取方法。这部分内容打破了我先前的认知,我认为覆盖率数据的获取都像AFL一样,通过二进制插桩的方法获取,但实际上覆盖率获取的方式有很多。
Part6
详细讲解如何实现持久模式