AFL ++模糊框架

2021-03-13 00:18:43

AFL ++是Google' S AFL的优越叉语 - 更多速度,越来越快,更好的仪器,自定义模块支持等。

如果要使用AFL ++进行学业工作,请检查PAPER PAGEON网站。要引用我们的工作,请查看CITE部分。比较使用FuzzBench Aflplusplus设置,或使用AFL-Clang-FastWith AFL_LLVM_CMPLOG = 1。

' +' ' -t'现在,选项意味着自动计算最大超时给出的值的超时。 &#34的原始含义;跳过超时而不是中止和#34;现在是-t选项所固有的。

使用AFL ++ 3.00,我们引入了破坏以前AFL和AFL ++行为和默认值的更改:

没有llvm_mode和gcc_plugin子目录,并且有一个编译器:afl-cc。所有以前的编译器现在对此符号链接。仪器源代码现在在仪器/文件夹中。

GCC_PLUGIN被adacore提交的新版本替换为OPSUPPORTS更多功能。谢谢!

qemu_mode升级到qemu 5.1,但能够建立这个currentninja构建工具版本和python3 setuptools .qemu_mode还得到了新的选项,如快照,instrumenting具体的库等。另外,qemu 5.1支持更多的cpu目标sothis真的值得它。

当仪器目标时,AFL-CC不会在给出任何情况下取代优化。这允许将目标与构建调试或释放相同。

AFL-FUZZ:如果指定了-M或-S,则假设-S默认值,因此稍后可以轻松添加更多功能

-i输入目录选项现在下降到子目录。它在崩溃和太大的文件上而不是致命的,而是跳过它们以用于拼接突变

默认情况下,现在禁用确定性模糊(除非使用-M)和-D启用

现在可以执行测试配置文件的缓存,可以修改Byiting Config.h for TestCase_Cache,也可以是指定env变量AFL_TESTCACHE_SIZE(在MB中)。良好的值在50-500之间(默认值:50)。

AFL ++支持LLVM高达版本12,非常快速的二进制模糊与QEMU 5.1,QEMU-Intel和Redqueen,Unicorn模式,GCC插件,Full * BSD,Solaris Andandroid支持以及更多。

默认为llvm> = 9.0,旧版本的env Var由于LLVM< = 8中的效率错误

在LLVM和GT的LTO模式下自动= 11,为所有LLVM版本写入文件以与AFL-Fuzz&#39一起使用的额外通行证; -X 当核心变化太快太快时,快照LKM目前不会扫描:-( AFL-GCC,仪器,QEMU_MODE和UNICORN_MODE的NeverZero修补程序,这可以防止包装地图值为零,增加覆盖范围 独角兽模式允许从完全不同的平台上模糊二进制文件(由Domenukk提供的集成) 要与其他用户进行比较或获取有关主要新功能的通知,请向[email protected]发送邮件。 请参阅文档/ QuickStartGuide.md,如果您没有时间toread此文件 - 但不建议! 稳定/行李箱:AFL ++的稳定状态 - 当我们对其稳定性感到满意时,它从时间堆积中同步

Dev:AFL ++ - 出血的发展状态,您可能会捕获不编译或有错误的Acheckout。 我们只接受DEV的PRS !! (任何其他):实验分支用于处理特定功能或测试网络功能或变化。 我们有几个想法我们希望在AFL ++中看到它更好。但是,我们已经努力工作了我们没有时间留下大想法的事情。 这可以是您支持和贡献AFL ++的方法 - 将其扩展到“发电机酷”。 对于想要贡献(并发送拉出请求)的人,请在提交之前阅读CONFICLUTING.MD。 通过Docker提供使用编译的所有内容安装AFL ++的简单方法:您可以使用Dockerfile(具有GCC-10和Clang-11 -HENCE AFL-Clang-LTO可用!)或直接从Docker Hub推出: 当稳定的回购时自动生成此图像。您将在容器中找到您的目标源代码/ src。

如果您想构建AFL ++自己,您有很多选项。最简单的选择是构建和安装所有内容:

sudo apt安装build-ension python3-dev automake flex bison libglib2.0-dev libpixman-1-dev python3-setuptools clang lld llvm llvm-dev libstdc ++ - devmake distribsudo make安装

建议在您的发行版中安装最新的可用GCC,Clang和LLVM-Devpossible!

请注意,"制作分销和#34;还构建仪器,Qemu_Mode,Unicorn_Mode和更多。如果你只想要普通的AFL ++然后做"制作所有"但是在这种情况下,强烈建议在至少仪表中编译和仪表。

测试:运行测试用例,以确保所有功能仍在使用时

除非您在Mac OS X上,否则您还可以通过传递静态= 1参数来构建静态链接的TheAFL ++二进制文件的版本:

如果您对模糊结构数据感兴趣(您定义了什么影片),这些链接您是否涵盖:

下面介绍如何使用目标模拟源代码。如果您有一个仅限二进制目标,请跳转到[#instrumenting二进制应用程序](#oplicating二进制应用程序)

使用一个专用编译器编译目标,该特殊编译器准备目标以有效地被禁止。这个步骤称为#34;仪表目标"

通过随机突变输入执行目标的模糊,并评估生成的输入在目标二进制中的新路径中处理。

AFL ++附带一个中央编译器AFL-CC,它包含各种不同的编译器目标和仪表选项。以下评估流程将帮助您选择最佳。

强烈建议安装最新的LLVM版本,不建议使用以下9以下。

+ ---------------------------- + |可用Clang / Clang ++ 11+ | - >使用lto模式(afl-clang-lto / afl-clang-lto ++)+ ---------------------------------见[仪器/ readme.lto.md](仪器/ readme.lto.md)| |如果没有,或者目标失败LTO AFL-Clang-LTO / ++ | V + ------------------------------ + | Clang / Clang ++ 3.3+可用| - >使用LLVM模式(AFL-Clang-Fast / AFL-Clang-Fast ++)+ -------------------------------- +请参见[仪器/ readme.llvm.md](仪器/ readme.llvm.md)| |如果没有,或者目标与LLVM AFL-Clang-Fast / ++失败| v + ------------------------------- + | GCC 5+可用| - >使用GCC_PLUGIN模式(AFL-GCC-FAST / AFL-G ++ - FAST)+ ---------------------------------请参见[仪器/ readme.gcc_plugin.md](instrumentation / readme.gcc_plugin.md)和[侦察/ readme.instrument_list.md](instrumentation / readme.instrument_list.md)| |如果没有,或者如果您没有插件支持的GCC | V使用GCC模式(AFL-GCC / AFL-G ++)(或克朗的AFL-Clang / AFL-Clang ++)

模式可以是:lto(afl-clang-lto *),llvm(afl-clang-fast *),gcc_plugin(afl-g * -fast)或gcc(afl-gcc / afl-g ++)或clang(afl -clang / afl-clang ++)。

由于没有接受AFL特定的命令行选项(除了 - AFL-Mode命令旁边),编译时工具可以使用AFL-CC-HH或通过读取文档/ env_variables来列出的环境variables相当广泛地使用环境variables。 MD。

拆分整数,字符串,浮点和交换比较,因此AFL ++可以易于实现这些。如果您没有一个非常好的大型输入语料库,这是一个重要的选项。此技术称为Laf-Intel或Compcov.要使用此设置在编译Thetarget之前的以下环境变量:导出AFL_LLVM_LAF_ALL = 1您可以在仪器/ README.LAF-INTEL.MD中了解更多有关此内容

不同的技术(通常是一个比Laf-Intel)是ToinStument的目标,使得目标中的任何比较都被发送到ToaFl ++,然后将这些值置于不同的垂直时的模糊数据。这种技术非常快,良好 - 如果目标在比较之前没有转发输入数据。因此,这种技术被称为输入到状态或redqueen.if如果您要使用此技术,那么您必须使用/ for此模式进行编译,然后将此二进制文件传递给afl-fuzzvia -c参数。注意您也可以编译一个CMPLOG二进制文件,并使用它的两者都有表现性能。您可以在仪器/ README.CMPLOG.MD中阅读更多关于此信息。

如果您使用LTO,LLVM或GCC_PLUGIN模式(AFL-CLANG-FAST / AFL-Clang-LTO / AFL-GCC-FAST)您可以选择仅选择符合您对以下内容的目标的仪器部分:

仅乐于您感兴趣的目标的那些部分,您感兴趣地使用应将其源代码的所有文件名投入文件。对于AFL-Clang-LTO和AFL-GCC-FAST - 或AFL-Clang-Fast,如果其他模式使用thandefault / pcguard或者您有llvm> 10.0.0 - 只需每行onefileName或函数(无需forfilenames9所需的目录信息,并且over export afl_llvm_allowlist = allowlist.txt或导出afl_llvm_denylist = denylist.txt - 取决于您是否希望佩戴仪器,除非(校友)或不执行internerationUnless请求(alletList)。注意:在优化期间,可能会内向,然后不会匹配!请参阅仪器/ readme.instrument_list.md

有更多的选项和模式可用,但是最重要的是效率较低。看:

如果目标具有使模糊更困难的功能,例如,Checksums,HMAC等。然后修改源代码,以便此Isromoved。这甚至可以通过消除此特定定义中的检查来完成操作源代码:

#ifdef fuzzing_build_mode_unsafe_for_production //说校验和或hmac是精细的 - 或者无论是必需的//要消除Fuzzer的需要猜测右校验和返回0; #endif

在此步骤中,编译目标源代码,以便可以模糊。

基本上,您必须告诉目标构建系统使用所选的AFL ++编译器。此外 - 如果可能 - 您应该始终配置Build系统,使目标是静态编译的,而不是动态编译。以下是这样描述的。

有时配置和构建系统是Fickle,不喜欢输出(并认为这意味着测试失败) - 这是某种东西++喜欢显示统计信息。建议通过导出afl_quiet = 1禁用它们。

有时在警告上配置和构建系统错误 - 这些应均匀(例如 - 用于某些配置脚本的 - disable-werror)。

如果配置/构建系统抱怨AFL ++' S编译器AndABORTS然后设置导出AFL_NOOPT = 1,然后只能表现出Thereal Compiler。在建立目标之前,必须再次未命中此选项!

请注意,如果您使用的是(更好)AFL-Clang-LTO编译器,您还将TOSET AR与LLVM-AR [-Version]和Ranlib到LLVM-Ranlib [-version] - 如仪器/ Readme.lto.md中的IsDescrib 。

请注意,如果您使用的是(更好)AFL-Clang-LTO编译器,您还将TOSET AR与LLVM-AR [-Version]和Ranlib到LLVM-Ranlib [-version] - 如仪器/ Readme.lto.md中的IsDescrib 。

对于Meson,您必须使用第一个命令设置AFL ++编译器! CC = AFL-CC CXX = AFL-C ++ MESON

有时CMake和Configure不会拾取所需的AFL ++编译器或TherAnlib / AR - 因为它只无法通过TaveRof的Developerof预见。或者他们有非标准选择。弄清楚是否有ANON标准方法来设置此方法,否则正常设置构建并手动编辑根本构建环境,以将其指向正确的编译器(和/或ranlib和AR)。

如果你只是模糊了一个目标计划 - 你是浪费一个很好的机会formuch更多的模糊速度。

这是所谓的持久模式,这很速度更快,更快地授权,即您代码一个专门调用要模糊的目标功能的源文件,以及围绕若干特定的AFL ++函数。有关详细信息,请参阅仪器/ readme.persistent_mode.md。

基本上,如果你没有在持久模式下模糊目标,那么你就是为了一个爱好而不是专业:-)

当您使用突变输入的目标来说,随着Thetarget的不同输入,尽可能提高效率。

尝试从您可以随时随地收集目标的有效输入。例如。如果是PNG图片格式,请尝试找到尽可能多的PNG文件,例如,从互联网,从互联网,单位测试箱数据 - 来自各种PNG软件的随机下载。

如果输入格式未知,您还可以将目标程序修改为其接收和处理文件的标记数据并使用这些程序。

使用AFL ++工具AFL-CM删除从语料库中删除要在目标中进行新路径的语料库的输入。

如果要通过模糊调用目标程序作为箱/目标-D输入inflope运行afl-cmin:afl-cmin -i输入-oinpings_unique - bin / target -d @@注意到目标的inputfile参数程序将读取必须设置为@@。

如果目标从STDIN读取,则只是省略@@,因为这是thedfault。

输入文件仍然遍历目标的相同路径,模糊将越好。使用AFL-TMIN完成的这种最小化是一个很长的过程,因为这对每个文件都已完成:

mkdir inputcd inputs_uniquefor i在*; do afl-tmin -i" $ i" -o" ../输入/ $ i" - Bin / target -d @@ done

来自步骤b)的Inputs_unique /目录 - 甚至更好目录输入/如果您在步骤c中最小化语料库) - 是生成的输入语料库目录,用于模糊! :-)

在这个最后一步中,除非您想要使用许多CPU核心/线程来模糊,否则都没有那么多的重要选择,除非您想要使用许多CPU内核/线程,除非您想要模糊,否则这将使模糊更加有用。

如果您只需使用一个CPU进行模糊,那么您就可以为乐趣而且不受欢迎:-)

甚至甚至在AFL-Fuzze执行sudo afl-system-config的测试运行之前(如果在Docker容器中执行AFL-Fuzz)。这将重新配置系统以获得最佳速度 - 哪个AFL-Fuzz检查和保释。对于AFL-Fuzz的AFL_SKIP_CPUFREQ = 1,以跳过此检查是否无法为主机上的root权限配置为何种原因。

如果从步骤2中有输入语料库,则使用-ioption指定此目录。否则创建一个新目录并在那里创建一个带有任何ContentAs测试数据的文件。

如果您不想要任何特殊的话,默认值通常是最好的,因此您所需要的只是指定具有第2A的结果的种子输入目录。收集输入:AFL-FUZZ-I输入-O输出 - 箱/目标-D @@注意,如果它不存在,将创建使用-o指定的目录。

如果需要停止并重新启动模糊,请使用相同的命令行选项(或者甚至通过选择不同的电源计划或其他utight模式来更改它们!)并使用Dash( - ):AFL-FUZZ的输入目录切换输入目录 - I - -o输出 - 宾/目标-D @@

默认情况下,AFL-Fuzz不强制执行内存限制,系统可能会跳动内存。您可以使用-m选项减少内存,值为ISIN MB。如果目标对于目标太小,则通常可以看到这种Byafl-Fuzz,并使用它无法连接到ForkServer的消息。

添加字典是有帮助的。请参阅目录字典/ ifsomething已包含为您的数据格式,并告诉AFL-Fuzz以加载字典通过添加-x字典/ format.dict。随着AFL-Clang-Ltoyouou的使用,您需要为其进行自动暗示,除了使用AFL-Clang-LTO作为编译器。您还可以选择Metainatea字典自己,请参阅Utils / libtokencap / Readme.md。

AFL-Fuzz有各种选项,可以帮助对输入文件(-F)的最低点数位置,而不是执行确定性字符(-d)等。检查AFL-FUZZ-]。

默认情况下,AFL-FUZZE永远不会停止模糊。要终止AFL ++,只需按Control-Cor发送信号Sigint。您还可以使用选项限制执行的执行次数或近似Runtimein秒。

当您启动AFL-fuzz时,您将看到一个显示的用户界面,显示Stateis:

如果您想认真欺骗,那么尽可能多地使用核心/线程,因此您的目标也可以使用您的目标。

在同一台机器上 - 由于设计了AFL ++如何工作 - 有一个有用的CPU核心/线程的最高数字,而是使用更多和整体执行判处。此值取决于目标,限制为每台计算机32个核心。

如果您有RAM,强烈建议使用TestCase的缓存运行该实例。根据平均testCase大小(和那些捕获的模糊)及其数字,建议使用50-500MB之间的值。您可以通过设置环境变量AFL_TestCache_Size来设置缓存大小(在MB中)。

应该有一个主要的模糊(-m主页选项)和尽可能多的辅助功能(例如--s variant1),因为您使用的核心.Every-m / -s条目需要一个唯一的名称(这可能是什么),但是必须用于所有实例的同位输出目录位置。

一个应该模仿编译的目标:使用SanitizersActivated(导出AFL_USE_ASAN = 1;导出AFL_USE_UBSAN = 1;导出AFL_USE_CFISAN = 1;

一到三个模糊应该模糊用Laf-Intel / Compcov编译的目标(见上文)。重要说明:如果您运行多个LAF-Intel / Compcovfuzzer,并且希望它们共享其中间结果,则主营文件(-m)必须是其中之一!

使用不同的电源计划运行,可用:快速(默认),探索,Coe,Lin,四边形,漏洞利用,MMOPT,罕见,寻求您可以设置的。 -P Seek.

此外,建议将导出afl_import_first = 1设置为首先在活动中加载testCases。

您也可以使用不同的模糊。如果您使用的是AFL Spinoffs或AFL符合模糊,那么只需使用TheSame -o目录并给它一个唯一的名称.Examples是:

但是,您还可以使用Hongggfuzz的Libfuzzer同步AFL ++,静音显示主模糊(-M),其中-F选项,其中不同的模糊机的队列/工作量是,例如, -f / src / target / honggfuzz。

只需提供AFL-Fuzz所提供的目录--OO选项,您将在该广告系列加达摘要中看到每个模糊机的详细状态。

一个更好的指示符 - 如果使用至少具有至少至少参考的LLVM仪表,则是使用OFL-ShowMap在输出目录上的收集覆盖选项-c:

$ afl-showmap -c -i out -o / dev / null - ./target -params @@ ... [*]使用共享内存模糊功能。[*]目标映射大小:9960 [+]处理7849输入文件。[+]捕获了4331元(最高值255,总值67130596),' / dev / null'。[+] 4331边缘的覆盖范围在现有的9960年(43.48%)中实现了7849输入文件。

甚至更好地查看已达到的确切代码行 - 到目前为止未找到。

一个" Easy"辅助脚本为此是https://github.com/vanhauser-thc/afl-cov,just按照该单独项目的自述文件。

如果您发现到目前为止未涵盖一个重要的领域或功能,以查找能够达到的输入并开始具有作为输入的种子的新的辅助Inthat模糊运动,让它运行几分钟终止它。主节点将升起并随着时间的推移将其可用于其他辅助节点。如果您有nofree cor,则设置导出afl_no_aft = 1

......