用程序怎么在网站输入数据-AFL 的模糊之旅

前言

我想介绍一些不一样的东西——fuzz,也就是大家常说的模糊测试。 Fuzz近年来成为安全会议的热门话题,论文提交也越来越难。 成功的模糊测试甚至可以发现数十个 CVE。 我打算在本文中先介绍模糊相关的知识,然后以 AFL 为例演示一个模糊反例; 不足之处欢迎读者指正。

什么是模糊

在挖掘软件漏洞时,通常有静态分析、动态分析、符号执行、模糊测试等几种技术手段。

静态分析是指不实际运行目标程序,而是通过分析各种句型、语义、数据流等来发现漏洞。 通过静态分析软件进行静态分析; 它速度快,但误报率很高。

动态分析就是我们一般看到掠夺者利用od来跟踪程序一步步运行的分析。 其准确率非常高,但需要调试人员丰富的知识储备,而这些调试方法很难进行大规模的程序漏洞挖掘。

简单来说,符号执行就是试图找到哪个输入对应什么样的运行状态,需要覆盖所有的执行路径。 因此,当待分析的程序比较复杂、执行路径较多时,就会遇到路径爆炸的问题。

模糊测试不需要太多的人类参与,也不需要分析者像动态分析那样拥有丰富的知识。 简单解释一下用程序怎么在网站输入数据,就是手动执行有大量输入数据的程序,从而找出哪些输入可以让程序出现异常,然后分析可能存在的漏洞。 目前比较成功的fuzzer(进行模糊测试的程序)有AFL、libFuzzer、OSS-Fuzz等。

使用AFL来说明一个典型的Fuzz流程

用程序怎么在网站输入数据-AFL 的模糊之旅

调试器向程序提供一些输入,即最右边的测试用例,AFL 将其加载并转储到队列中。 对于每次迭代,AFL首先从队列中取出一个测试用例,然后对其进行剪枝,去除不必要的数据,以提高运行效率; 然后改变输入。 变异模式有很多种,可以形成很多新的测试用例。 对于这个新形成的输入,将它们发送到目标程序来运行。 如果可以形成新的执行路径或者程序崩溃,则会再次放入队列中。 在整个过程中,程序崩溃都会被记录下来,这可能代表着一个隐藏的漏洞。

Fuzz的技术要点

那么这项技术的主要难点,或者说影响挖矿效率的点是什么呢? 关于这类问题的研究经常可以在安全会议上看到。 例如,2019年USENIX使用粒子群算法辅助变异算子的选择。AFL的变体AFLGo也发布在CSS上。

输入数据

因为输入数据是用来手动执行程序的,所以很明显数据的生成会极大地影响挖掘效率。 1、如果目标程序的输入格式是pdf文件,那么如果文件不符合该格式,则很难进入目标程序运行测试。 2. 即使数据满足输入要求,也可能数据A和数据B触发相同的执行路径,因此让A和B都运行是一种资源浪费。 3、对于个体数据A来说,可能只有一小部分真正控制了执行路径,所以剩下的处理是浪费资源。

对于第一个输入格式问题,基于生成的模糊器给出了可行的解决方案。 简单来说,它需要一些关于输入数据格式的先验知识,以便它可以更好地根据用户输入形成新数据。 对于第二个问题和第三个问题,AFL中给出了相应的解决方案。 afl-cmin可以给出输入数据的最小集合,即上述A和B将保留3个; afl-tmin 还可以压缩单个输入文件。

变异操作

用户给出的数据是有限的,但是模糊测试需要大量的数据,因此模糊器会根据用户给出的数据生成新的数据。 这个过程就是所谓的变异操作。 那么变异过程中定义了什么变异算子(即改变原始输入数据的操作)? 当在一个变异中面对多个变异算子时,我应该选择哪一种? 使用什么输入数据进行突变?

用程序怎么在网站输入数据-AFL 的模糊之旅

增加覆盖范围

Fuzz的本质是利用输入来检查当前输入对应的执行路径是否会形成可能的漏洞。 因此,如果覆盖的路径越多,就意味着可能检测到更多的漏洞。 提高覆盖率更像是一个根本问题。 虽然前两个问题得到了解决,但覆盖率也得到了提高。

澳式足球联盟战斗

安装要点

虽然AFL有多种模式,除了标准模式之外,还有llvm模式和qemu模式。 得益于 clang,llvm 模式下模糊速度更快; 在qemu模式下,可以对二进制程序进行模糊测试。 很多人在安装的时候并没有同时编译安装llvm模式。 虽然后面可以单独编译,但是AFL官方文档建议,如果你想让所有系统用户都使用llvm模式,那么在编译安装AFL的时候应该同时安装llvm模式。

安装过程中还有一个陷阱:很多人喜欢在docker中使用用程序怎么在网站输入数据,但打开容器时不要忘记添加--privileged选项,否则执行以下命令之一时会失败。

安装过程我就不详细说了,但是这里推荐一个安装过程。

如果 docker 没有添加 --privileged 此命令将失败:

用程序怎么在网站输入数据-AFL 的模糊之旅

下面是安装AFL时编译安装的llvm模式:

编译并安装目标程序

我们这次选择w3m作为目标程序。 下载完源码后,为了AFL顺利进行fuzz,我们不能直接用gcc编译,而是使用afl提供的afl-gcc。

Afl-gcc 是做什么的? 事实上,当我们从源代码得到二进制程序时,要经历从源代码到汇编代码,再从汇编代码到机器代码的过程。 Gcc(特别是gcc编译器)可以将源代码转换为汇编代码,而as(也是GNU编译器套件的一部分)将汇编代码转换为机器代码。 Afl-gcc 是 gcc 编译器的一个软件包。 它一方面调用gcc编译器进行编译,另一方面为汇编指定afl-as而不是as。 Afl-as 也是 as 的一个包。 一方面,它分析汇编代码并执行插装操作。 另一方面,它调用 as 将检测后的汇编代码转换为机器代码。

有人可能又问了,什么是配股? 简单来说,就是在目标程序的代码中插入一些额外的代码,告知fuzzer目标程序的运行情况。

简单了解了原理之后,我们来编译一下w3m:

cd ./w3m

CC=afl-gcc ./configure

用程序怎么在网站输入数据-AFL 的模糊之旅

制作

由于我们只进行模糊测试并且不想实际安装w3m,因此我们不需要进行makeinstall。

收集和处理输入数据

为了能够进行模糊测试,我们需要提供一些输入数据。 W3m是一个命令行浏览器,因此我们可以收集一些html文件作为输入。 注意,AFL的作者建议输入文件不要太大,尽量保持在1KB以内。 这里我找到了几个文件作为示例:

如上所述,我们可以使用 afl-cmin 和 afl-tmin 来减少输入数据。 下图是使用afl-cmin取最小集合的例子。 由于输入太少,它们都可以触发不同的路径,因此不会删除任何文件。

下图是使用 afl-tmin 修剪单个文件的反例。 为了提高速度,可以编写一个脚本来多线程对所有输入文件进行归约操作,否则这个过程非常耗时。

用程序怎么在网站输入数据-AFL 的模糊之旅

开始运作

使用以下命令在 w3m 上启动模糊操作:

如果不主动停止,这个模糊测试过程就不会结束。 在右上角,您可以听到到目前为止已发现的独特崩溃数量。

运行内省

以上只是一个简单的测试,那么在实践中,有没有办法优化上述模糊过程呢?

您可以使用AFL的并行模式来提高模糊测试效率。 运行一段时间后可以暂停AFL,进入保存队列的文件夹,剪切队列中的测试用例,然后继续运行; 您还可以使用 llvm 模式来提高速度。

虽然上面的模糊测试是对本地程序进行模糊测试; 事实上,AFL还可以借助丰富的插件或编写简单的入口代码来模糊网络程序和库文件。 写这篇简单的文章希望向您介绍Fuzz,以便您可以将Fuzz应用到自己的漏洞挖掘中。

和田网络安全实验室(Fuzz的AFL)的相关实验可以让您了解如何使用AFL,通过AFL模糊测试测试一些简单的软件,学习模糊测试的基本技巧和思想。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站程序 用程序怎么在网站输入数据-AFL 的模糊之旅 https://www.wkzy.net/game/172952.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务