26-13

说说 AFL++ 和 AFL 有哪些不同

AFL (American Fuzzy Lop)

首先,我们回顾一下 AFL。AFL 是由 Google 的 Michał Zalewski 开发的一款覆盖率引导的模糊测试工具,它开创了一个时代

  • 核心思想: AFL 将模糊测试带入了一个新的高度,它不只是随机地变异输入,而是会监控程序的代码覆盖率。如果一个输入能让程序执行到之前未执行过的代码路径,AFL 就会认为这个输入“有价值”,并将其保存下来,然后基于这个输入进行更多的变异
  • 工作流程:
    1. 从一个种子文件(或一组种子文件)开始
    2. 对种子文件进行一系列的变异操作(如位翻转、字节插入、删除)
    3. 运行变异后的输入,同时监控代码覆盖率
    4. 如果发现新的代码路径,则将该输入加入到种子队列中,作为新的变异基础
    5. 如果程序崩溃,则保存导致崩溃的输入,作为漏洞报告

AFL 的出现,使得模糊测试的效率和深度得到了革命性的提升

AFL++ (AFLplusplus)

AFL++ 是在 AFL 的基础上发展起来的一个项目。它由一群顶尖的模糊测试研究人员和开发者维护,旨在整合所有 AFL 的优秀改进和新技术

简而言之,AFL++ 是 AFL 的超集。它保留了 AFL 的核心思想和工作流程,但加入了大量的优化和新功能,使其在效率和能力上都远超原版 AFL

特性 AFL AFL++
模糊测试算法 基础的位翻转、字节插入、随机数等。 更丰富、更智能的变异算法。包括 CmpLog、Redqueen 等技术,能够智能地发现和变异比较指令的魔术字节。
覆盖率指导 基本的代码覆盖率指导。 更精细的覆盖率指导。通过 LTO、LLVM 和 GCC 等编译器插桩技术,可以获得更精确的覆盖率信息,甚至可以识别代码中的分支类型。
字典支持 有简单的字典支持。 更强大的字典支持。可以自动从目标程序中提取字典(例如文件头、关键词等),并通过字典来加速对复杂文件格式的理解。
代码插桩 基于 GCC 和 LLVM 的基本插桩。 多种插桩模式。除了编译器插桩,还支持 QEMU 模式的动态二进制插桩,可以对闭源程序进行模糊测试。
性能 优秀 卓越。通过代码优化和更智能的算法,其测试速度通常比原版 AFL 更快。
兼容性 仅支持 Linux 和部分 Unix-like 系统。 更好的兼容性。支持更多编译器、更多操作系统,并集成了更多的辅助工具。