在本文中,我们将讨论的不是经典AFL本身,而是关于为其设计的实用程序及其修改,我们认为,这些实用程序可以显着提高模糊测试的质量。如果你想知道如何提高AFL以及如何更快地找到更多漏洞 - 继续阅读!
AFL是一种覆盖引导或基于反馈的模糊器。关于这些概念的更多信息可以在一篇很酷的论文“Fuzzing:Art,Science,and Engineering”中找到。让我们总结一下AFL的一般信息:
它修改可执行文件以了解它如何影响覆盖范围。
改变输入数据以最大化覆盖范围。
重复上一步以找到程序崩溃的位置。
它非常有效,通过实践证明。
它非常易于使用。
这是一个图形表示:
如果你不知道AFL是什么,这里有一个有用的资源列表供你开始:
该项目的官方页面。
afl-training - AFL的简短介绍。
afl-demo - 使用AFL模糊C ++程序的简单演示。
afl-cve - AFL发现的漏洞集合(自2017年以来尚未更新)。
在这里,您可以阅读AFL在构建过程中添加到程序中的内容。
关于模糊网络应用程序的一些有用提示。
在撰写本文的那一刻,AFL的最新版本为2.52b。模糊器正在积极开发中,随着时间的推移,一些侧面开发正在被纳入主AFL分支并变得无关紧要。今天,我们可以列举几个有用的附件工具,这些工具将在下一章中列出。
Rode0day比赛
还值得一提的是每月一次的Rode0day竞赛 - 在这里,模糊测试人员试图以更少的时候在预制语料库中比对手找到最大数量的错误,无论是否有源代码。就其本质而言,Rode0day是AFL的不同修改和分叉之间的争斗。
AFL还有不同的变体和衍生物,允许模糊化Python,Go,Rust,OCaml,GCJ Java,内核系统调用,甚至整个虚拟机。
AFL用于其他编程语言
python-afl - 用于Python。
afl.rs - 用于在Rust上编写的模糊程序。
afl-fuzz-js - 用于javascript的afl-fuzz。
java-afl - 用于Java的AFL模糊测试。
kelinci - Java的另一个fuzzer(关于该主题的文章)。
javan-warty-pig - 用于JVM的AFL式模糊器。
afl-swift - 用于在swift上编写的模糊程序。
ocamlopt-afl - 用于OCaml。
sharpfuzz - 基于afl for .net的模糊器。
在本章中,我们收集了AFL的各种脚本和工具,并将它们分为几类:
afl-utils - 一组用于自动处理/分析崩溃并减少测试用例数量的实用程序。
afl-crash-analyzer - AFL的另一个崩溃分析仪。
fuzzer-utils - 一组用于分析结果的脚本。
atriage - 一种简单的分类工具。
afl-kit - 关于Python的afl-cmin。
AFLize - 一种自动生成适合AFL的debian包构建的工具。
afl-fid - 一组用于处理输入数据的工具。
afl-cov - 提供有关覆盖范围的人性化数据。
count-afl-calls - 比率评估。脚本计算二进制中的检测块数。
afl-sancov - 就像afl-cov一样,但是使用了一种 clang sanitizer.。
covnavi - Cisco Talos Group负责代码和分析的脚本。
LAF LLVM - 通过类似于AFL的补丁集合,可以修改代码,使模糊器更容易找到分支。
afl-pytmin - afl-tmin的包装器,它试图通过使用许多CPU内核来加速最小化测试用例的过程。
afl-ddmin-mod - 基于ddmin算法的afl-tmin的变化。
halfempty - 是Tavis Ormandy基于并行化最小化测试用例的快速实用工具。
disfuzz-afl - 为AFL分发模糊测试。
AFLDFF - AFL分布式模糊测试框架。
afl-launch - 用于执行许多AFL实例的工具。
afl-motherhip - 在AWS云上管理和执行许多同步AFL模糊器。
afl-in-the-cloud - 另一个在AWS中运行AFL的脚本。
VU_BSc_project - 使用libFuzzer和AFL对开源库进行模糊测试。
最近,已经发表了一篇非常好的文章,论文名称为“Scaling AFL to a 256 thread machine”。
afl-other-arch - 是一组补丁和脚本,用于轻松添加对AFL的各种非x86体系结构的支持。
afl-trivia - 一些简化AFL管理的小脚本。
afl-monitor - 用于监控AFL的脚本。
afl-manager - 用于管理multi-afl的Python上的Web服务器。
afl-tools - 具有afl-latest,afl-dyninst和Triforce-afl的码头工具的图像。
afl-remote - 用于远程管理AFL实例的Web服务器。
AFL对脆弱性研究人员和模糊本身产生了非常强烈的影响。一段时间后,人们开始根据原始AFL进行修改,这一点都不足为奇。我们来看看它们。在不同的情况下,与原始AFL相比,这些修改中的每一个都有其自身的优缺点。
几乎所有的mod都可以在hub.docker.com找到。
在继续研究AFL的不同修改和分支之前,我们必须讨论两种重要的模式,这些模式在过去也有过修改但最终被合并。他们是Syzygy和Qemu。
Syzygy模式 - 是在instrument.exe中工作的模式
Syzygy允许使用AFL静态重写PE32二进制文件,但需要符号和一个额外的开发人员才能识别WinAFL内核。
Qemu模式 - 它在QEMU下的工作方式可以在 “Internals of AFL fuzzer — QEMU Instrumentation”.看到。使用QEMU的二进制文件的支持被添加到版本1.31b中的上游AFL。AFL QEMU模式使用二进制检测功能添加到qemu tcg(一个微小的代码生成器)二进制转换引擎中。为此,AFL有一个构建脚本qemu,它提取某个版本的qemu(2.10.0)的源代码,将它们放到几个小的补丁上,并为定义的架构构建。然后,创建一个名为afl-qemu-trace的文件,该文件实际上是一个用户模式仿真文件(仅可模拟可执行ELF文件)qemu-。因此,对于qemu支持的许多不同体系结构,可以使用对elf二进制文件的反馈进行模糊测试。此外,您还可以获得所有酷炫的AFL工具,从显示器上获取有关当前会话的信息,以及afl-analyze等高级内容。但是你也得到了qemu的局限性。此外,如果使用硬件SoC特性构建工具链文件(启动二进制文件,qemu不支持),那么一旦使用了特定的指令或特定的MMIO, fuzzing就会中断。
这是qemu模式的 另一个有趣的分支,其中速度增加了3-4倍,使用TCG代码插桩和兑现。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-4-27 11:10
被影身火编辑
,原因: 调整格式,添加跳转链接