项目地址
MemAFL:https://github.com/treebacker/MemAFL
简要介绍
一句话:属于本人的毕业设计实现的一个AFL改进的模糊测试工具,也是帮助本人第一次刷CVE的工具。
主要基于llvm做的插桩上的改进,改进的几个重点(改进代码都在mm_metric
目录下)
程序的预分析
通过llvm在每一个module中分析字符串处理函数,对于
strcmp
、strcpy
、strcat
等这种函数如果引用了常量字符串,那么说明这些字符串有影响程序控制流的可能,将保留作为种子因素,参与后续的种子变异中。内存敏感
主要从两个方面,一个是指令级,会记录每一个种子程序的执行路径覆盖的mem-operation情况。
另一个是函数级,对于敏感函数,如
malloc
、free
等,会偏向于覆盖这些路径。路径覆盖
基于插桩获取的信息,覆盖更多的路径,继承的AFL的策略,加上了内存敏感的路径覆盖。
另外,也会记录路径中的子函数调用情况,优先选择调用子函数更频繁的种子。
哈希碰撞率的缓解
研究过AFL原理的应该记得,AFL使用的路径记录策略,当程序基本块量足够大时,会有很大概率的哈希碰撞情况。由于基于覆盖率的模糊测试依赖于路径,路径信息的错误使得后续很多策略都是受到误导的。
缓解的思想如下图:
在AFL中,这个函数会被插入三个BlockID,但是MemAFL只会插入一个BlockID。
原因如下:
函数的入口基本块,只要执行该函数就一定会执行完全该基本块,不存在去区分路径,所以就省去了插桩。
对于函数退出基本块,如果是唯一的,那么也适用于这个道理。
通过减少插桩点,对应的,需要记录的路径信息减少了,经过测试可以降低10%-20%的哈希碰撞率。
发现的CVE
最后
其实总体上,做出的改进并不多,但是效果作为毕设我还是挺意外的,毕业证拿到了,想开源出来(被捶认了),欢迎师傅交流,一起学习漏洞挖掘漏洞利用啊!