皇冠体育寻求亚洲战略合作伙伴,皇冠代理招募中,皇冠平台开放会员注册、充值、提现、电脑版下载、APP下载。

首页科技正文

usdt无需实名买入卖出(www.caibao.it):模糊测试手艺入门,Part 1-2

admin2021-04-29102技术

USDT第三方支付平台

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

模糊测试手艺入门,Part 1:理论概述

首先,到底什么是模糊测试?当我们对一个吸收输入(任何类型的输入)的程序或函数举行模糊测试时,我们会实验差别的输入组合,直至令程序溃逃或获得其他想要的效果(经常是内存泄露)为止。若是一个程序没有准确地对其输入举行过滤的话,那么,当用户提供畸形或不准确的输入内容时,就会导致程序溃逃,或引发意想不到或未定义的行为。对于模糊测试,人人可能听说过的一个例子就是dirbusting手艺——当我们实验差别的URL,可以先从常见的最先,直到找到网站中的正当目录为止。为了完成这种测试,我们可以借助于像fuff这样的工具。

现实上,模糊测试手艺稀奇适用于用低级编程语言或过时的编程语言编写的程序,这些编程语言包罗Basic、Assembly、C/C++等,由于这类程序在编写历程中更容易失足,好比不适当的类型转换、释放后使用破绽、或者内存溢出破绽(缓冲区溢出、栈溢出、整数溢出)。更主要的是,这些错误通常纷歧定会导致运行时溃逃或编译时错误,因此,它们更有可能被精明的攻击者所行使。通常情况下,当提到模糊测试一词时,指的就是这种类型的模糊测试。

模糊测试的类型

现实上,常见的模糊测试手艺有三种,下面划分举行先容。

白盒模糊测试

我们所说的白盒模糊测试,现实上指的是这样一种测试手艺:Fuzzer会试图剖析程序的内部结构,以跟踪和最大化代码笼罩率。代码笼罩率指的是我们的代码所到达的分支比例;每次运行if或while等条件语句时,代码都市选择一个分支,也就是说,当条件语句为真时,代码会选择一个分支;当条件为假时,代码会选择另一个分支。白盒模糊测试的事情原理是,若是某个分支中隐藏着编程错误,我们首先必须确保在第一时间到达了谁人分支。要举行这种剖析,必须在编译历程中对程序举行插桩处置。

插桩手艺的事情原理是,每次运行一个分支时,都市挪用一个特殊的函数,将该分支纪录为已经运行,有时甚至会纪录哪一行被运行,以便跟踪笼罩局限。此外,插桩手艺还可以用来发现安全破绽。例如,Address Sanitation(ASan)有助于找到通常不会导致溃逃的内存泄露。由于完整的结构剖析需要消耗大量的系统资源,以是白盒模糊测试的速率通常很慢,但在寻找编程错误和破绽方面,效果照样非常好的,尤其是隐藏在程序深处的编程错误和安全破绽。固然为了举行普遍的插桩剖析,用户必须能够接见源代码,而源代码并不总是可用的,稀奇是对于攻击者来说,尤其云云。

黑盒模糊测试

对于这种模糊测试方式来说,我们并不体贴程序的内部结构,而是把它看成一个黑盒子看待。不外,我们照样可以行使程序的输出来试图弄清楚程序内里发生的事情,从而制作出更巧妙、更有用的输入。由于避免了白盒模糊测试相关的开销,因此,黑盒模糊测试的速率要更快一些,但在挖掘编程错误和安全破绽方面,其效果要差一些。

灰盒模糊测试

这种方式试图在上述方式各自的优点和瑕玷之间取得平衡,它会在编译时举行轻量级的插桩处置,而不是举行周全的剖析处置,以便盘算代码笼罩率和跟踪程序的状态。对于现在盛行的大多数Fuzzer来说,如AFL、HongFuzz和LibFuzzer等,都是接纳灰盒模糊测试手艺。为了执行这样的模糊测试,通常需要接见源代码,但若是只有可执行文件可用的话,也有一些变通的方式,但这些方式会严重影响其性能。在本文中,我不会解说这些手艺。

模糊测试相关手艺

和dirbusting手艺一样,模糊测试手艺并不需要借助于暴力攻击,也就是实验随机输入。事实上,暴力攻击并不是一种很好的模糊测试手艺,而且很少有人这样做。幸运的是,现实上另有一些更伶俐的手艺,可以在合理的时间和资源内带来更好的效果。接下来,我将讨论其中的两种。

基于突变的模糊测试手艺

这种手艺是基于灰盒模糊测试的。也就是说,我们首先从有用的、形式优越的输入最先,并对其应用种种类型的突变处置。同时,我们还可以行使插桩手艺,来获得最乐成的突变,展现新的分支,并把它们作为下一代的种子。这个历程有点让人联想到我们在自然界看到的达尔文自然选择。现实上,这种方式还能带来另外一个利益,那就是被程序过滤掉的突变会被镌汰,这样的话,就会只留下有用的输入。

对于该手艺,最著名的工具(也可以说是最著名的Fuzzer)是AFL,即American Fuzzy Lop。

AFL使用三种类型的基本突变,详细如下所示:

· 随机删除一个二进制位

· 随机插入一个二进制位。

· 随机翻转一个二进制位(把0酿成1,把1变为0)。

AFL在任何时候都不会只使用一种突变处置,而是在多种突变处置之间分配资源,并优先选择“能量”最大的突变。每个突变的“能量”取决于它运行的代码中的详细分支:由于输入越多的分支越为罕有,因此会为其分配更多的能量。此外,由于每个分支都有一个唯一的哈希值,这样就可以跟踪其执行次数。值得一提的是,这种手艺中的初始输入可以来自提供种种突变的字典。

基于语法的模糊测试手艺

您可能知道,有许多程序是无法吸收非结构化输入的,由于它们对若何形成输入有特定的规则。这些规则被称为输入的语法,由于它们类似于口语中的语法规则。为了对这类程序举行模糊测试,并使其涵盖大多数语法选项,Fuzzer必须领会相关的语法,否则,直接使用简朴突变发生的输入的话,它们将被过滤和抛弃。这样的模糊Fuzzer早已面世,可以对JavaScript、WASM、URL等举行模糊测试,但停止本文写作时,大部门都是实验性的,而且速率很慢,据我所知,这些Fuzzer都是用Python编写的,对于原型设计和演示来说,Python语言是个不错的选择,但对于优化的生产级Fuzzer来说,该语言就有点力有未逮了。因此,它们的应用并不普遍。

小结

在本文中,我们对模糊测试的理论举行了简朴的先容,在本系列的下一篇文章中,我们将为读者详细先容若何行使AFL对一个简朴的程序举行模糊测试。

模糊测试手艺入门,Part 2:基于AFL的模糊测试手艺

在本文中,我将将为读者详细先容若何在可以接见源代码的情况下通过AFL举行模糊测试。为了便于演示,这里将以GitHub网站上一个名为ccalc的开源程序为例举行解说。顾名思义,这是一个用C语言编写的简朴盘算器。之以是选择它,是由于我以为这个程序较旧,有较大概率可以通过模糊测试在其中发现导致溃逃的破绽,正如您将看到的,事实证明这个预测是准确的。

首先,我们需要确定一个目的。就这里来说,我决议直接对main()函数举行模糊测试,而不是寻找一些特定的函数举行模糊测试。其原因是,该程序在将输入内容交给现实举行盘算的函数之前,会先通过一系列函数剖析原始的输入内容。由于该程序在剖析历程中会筛选掉不准确的输入,因此直接特定函数是不合理的。

最初的main()函数大致如下所示(我稍微删减了一下):

,

usdt支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

归纳综合来说,它包罗两个分支:要么通过argc、argv[]获得输入,要么通过尺度输入(stdin)获得输入。我不知道为什么,但AFL的建立者明确建议不要通过argc、argv[]以及所有其他在线资源举行模糊测试。因此,我对这个函数做了一些修改:首先,我删除了处置来自argc、argv的输入内容的代码,然后尽可能地对其举行优化。究竟,每次Fuzzer实验另一个输入时,都市执行这个函数。因此,若是该函数效率低下的话,会拖慢整个测试历程。修改后的函数如下所示:

在这里,请注意我添加的循环语句。它指示AFL使用持久模式。在AFL的默认模式下,每当AFL运行程序时,它都市使用系统挪用fork()来建立一个新的子历程。然则,由于这个系统挪用的开销非常大,从而会严重拖慢整个模糊测试历程。当使用持久模式时,Fuzzer会重复使用同一个历程。这样做的唯一的要求是,在每次循环运行时都要擦除所有变量和缓冲区。

修改上面的函数后,将其保存到名为harness.c的文件中。在编译代码时,为了使用该文件而不是main.c编译程序,需要对automake文件举行响应的修改。修改前的automake文件如下所示:

将其改为:

现在,我们就可以对程序举行模糊测试了。为此,可以通过automake来天生make文件,然后执行下列下令:

这样程序就可以通过AFL举行插桩并编译了。

现在,唯一要做的就是建立AFL的初始输入文件夹,这里将其命名为“in”,将输出文件夹命名为“out”。在输入文件夹中,可以存放简朴文本文件(没有花样),用于提供正当的输入,好比“20/2”或“5*4”。由于我们想同时运行多个AFL历程(每个历程在自己的CPU核上运行),以是,我们需要为每个历程建立一个单独的输入文件夹。

要举行模糊测试,只需运行下面的下令即可:

上面,我们建立了第一个历程,下面,我们再来建立下一个:

然后,如法炮制。

从下面的截图中可以看到,AFL提供了一个GUI,用于显示模糊测试历程的主要信息。例如,在map coverage部门出了笼罩率,在findings in depth部门,GUI也给出了溃逃次数和相关信息。

在发现足够数目(详细数目由您决议)的溃逃后,通常是在长时间没有发现新的怪异溃逃后,我们就可以终止该历程了。对于运行的每一个AFL历程,都市在输出文件夹中天生一个单独的文件夹。

在这些文件夹内里,数据是这样排列的:

现在,我们对它们划分加以先容:

· plot_data:以有助于天生图形的形式提供信息。

· fuzzer_stats:模糊测试历程中的统计数据。

· fuzz_bitmap:一个bitmap,其中每个字节对应于程序的一个分支。

· “AFL维护着一个“fuzz bitmap”,其中的每个字节代表着被测试程序中某一分支被测试的次数。AFL不会在特定分支和bitmap中的字节之间举行一对一的映射。相反,AFL的嵌入式插桩手艺会将一个随机的两个字节的常量ID放入每个分支。每当执行到一个被检测的分支时,AFL就会对新分支的ID和到达新分支之前看到的最后一个分支ID举行XOR处置。这样就捕捉到了当前分支和到达该分支的唯一路径(例如当同一个函数从代码中的多个位置被挪用时)。然后,AFL会使用哈希函数对用XOR处置过的值举行响应的处置,以确定bitmap中的哪个条目代表该分支组合。每当一个特定的分支组合被测试后,bitmap中对应的字节中的值就会递增。"

· cmdline:提供给AFL的下令。现实上,就是该程序的名称。

· .cur_input:当前的输入。

· queue:到现在为止实验过的所有输入。

· crashes与hangs:用于存放测试效果。这些文件夹中的每个文件都包罗了导致溃逃或挂起的输入内容。在每个文件名中指定的是溃逃的内核信号(固然与挂起无关),AFL用来建立导致溃逃的输入的ID,AFL的运行时间,以及用来从其种子天生输入的突变方式。

本文翻译自:https://sayfer.io/blog/fuzzing-part-1-the-theory

网友评论

1条评论