【转载】基于AFL改进的内存敏感的模糊测试工具MemAFL

原文:https://xz.aliyun.com/t/10023

项目地址

MemAFL:https://github.com/treebacker/MemAFL

简要介绍

一句话:属于本人的毕业设计实现的一个AFL改进的模糊测试工具,也是帮助本人第一次刷CVE的工具。

主要基于llvm做的插桩上的改进,改进的几个重点(改进代码都在mm_metric目录下)

  • 程序的预分析

    通过llvm在每一个module中分析字符串处理函数,对于strcmpstrcpystrcat等这种函数如果引用了常量字符串,那么说明这些字符串有影响程序控制流的可能,将保留作为种子因素,参与后续的种子变异中。

  • 内存敏感

    主要从两个方面,一个是指令级,会记录每一个种子程序的执行路径覆盖的mem-operation情况。

    另一个是函数级,对于敏感函数,如mallocfree等,会偏向于覆盖这些路径。

  • 路径覆盖

    基于插桩获取的信息,覆盖更多的路径,继承的AFL的策略,加上了内存敏感的路径覆盖。

    另外,也会记录路径中的子函数调用情况,优先选择调用子函数更频繁的种子。

  • 哈希碰撞率的缓解

    研究过AFL原理的应该记得,AFL使用的路径记录策略,当程序基本块量足够大时,会有很大概率的哈希碰撞情况。由于基于覆盖率的模糊测试依赖于路径,路径信息的错误使得后续很多策略都是受到误导的。

    缓解的思想如下图:

    在AFL中,这个函数会被插入三个BlockID,但是MemAFL只会插入一个BlockID。

    原因如下:

    函数的入口基本块,只要执行该函数就一定会执行完全该基本块,不存在去区分路径,所以就省去了插桩。

    对于函数退出基本块,如果是唯一的,那么也适用于这个道理。

    通过减少插桩点,对应的,需要记录的路径信息减少了,经过测试可以降低10%-20%的哈希碰撞率。

发现的CVE

​ 都是一些没什么利用价值的开源软件…,上图

最后

​ 其实总体上,做出的改进并不多,但是效果作为毕设我还是挺意外的,毕业证拿到了,想开源出来(被捶认了),欢迎师傅交流,一起学习漏洞挖掘漏洞利用啊!