### 说说 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 系统。 | 更好的兼容性。支持更多编译器、更多操作系统，并集成了更多的辅助工具。