安全我爱编程

安全-peach测试

2018-04-11  本文已影响36人  yunpiao

开源Fuzz框架。

简介

Michael Eddington等人开发的Peach是一个遵守MIT开源许可证的模糊测试框架,最初采用Python语言编写,发布于2004年,第二版于2007年发布,最新的第三版使用C#重写了整个框架。

Peach支持对文件格式、ActiveX、网络协议、API等进行Fuzz测试;Peach Fuzz的关键是编写Peach Pit配置文件。

Windows下使用Peach3需要预先安装.net 4和windbg;Linux、OS X下需要安装Mono .net开发框架。

peach中最重要一部分就是peach Pit配置文件。Peach Pit文件包含以下内容:

1、General Configuration(通用配置)
2、Data Modeling(数据模型)
3、State Modeling(状态模型)
4、Agents and Monitors(代理和监视)    
5、Test Configuration(测试配置)

具体文件结构如下:

<?xml 版本,编码之类?>
<Peach 创建时间,地址,作者等等>
<Include 包含外部文件 />
<DataModel> 类型信息,关系(大小,计数,偏移)、可嵌套等<\DataMode>
<StateModel>测试逻辑,状态转换</StateModel>
<Agent>监视被测目标的情况,崩溃信息等</Agent>
<Test>指定使用哪个StateModel,Agent,Publisher、Strategy、Logger等</Test>
</Peach>

一、 数据模型(data modeling)

1.1 Data Model

(1)属性:

(2)子元素:

(3)例子:

DataModel例子DataModel例子 引用冲突例子引用冲突例子

当一个DataModel被解析时,自定义DataModel看起来像是两个数据模型的组合,如下所示:

冲突时真实解析格式冲突时真实解析格式

一个Peach文件中可以指定任意多个DataModel元素,但每个DataModel的名字必须唯一。通过DataModel可以将复杂的格式按照逻辑分解为更小的模型,使数据模型更易阅读、调试和重用。一个名字为“HelloWorld”的DataModel包含一个字符串和输出“Hello World!”如下所示:

1.2、 Blob

Blob元素是DataModel或Block的一个子元素。Blob元素常常用于代表缺少类型定义或格式的数据。如下所示:

(1)属性(除非声明,所有的属性都是可选的):

(2)子元素:

(3)例子:

一个简单的Blob。这个Blob中,任何类型或长度的数据能破解。


任意长度的数据任意长度的数据

1.3、 Block

与DataModel 类似
Block是DataModel或Block元素的子元素。Block用于在一个逻辑结构中将一个或者多个数据元素(Number或String)组织在一起,它和Datamodel非常相似,仅有的差异是它们的位置。DataModel是个顶层元素,Block是DataModel的一个子元素,它们都可以作为其他Block或DataModel的模板。

(1)属性(除非声明,所有的属性都是可选的):

(2)子元素:

Blob、 block、 Choice、 Custom、 Fixup、 Flag、 Flags、 Number、 Padding、Placement、 Relation、Seek、 String、 Transformer、 XmlAttribute、 XmlElement。

(3)例子:

嵌套的Block。Block可以根据需要多层的嵌套,它可以帮助创建逻辑结构而不改变数据包含的内容。


Block嵌套Block嵌套

这个嵌套的Block定义产生的输出为:1 2 3 4 。

引用属性允许构建健壮的模板,如下所示模板的名字为“Key”,值为“\r\n”。


enter description hereenter description here

使用该模板作为一个引用


enter description hereenter description here
输出为:
enter description hereenter description here

两个关键字符串在这里发生冲突。当解析时,自定义的Block将代替它的DataModel模板的结构。添加字符串值“:\r\n”。同时“customized”将覆盖String元素的“Key”和“Value”的值,用“Content-Length”和55代替。最终的DataModel将被解析如下:


enter description hereenter description here

1.4、 Choice

Choice是DataModel或者Block元素的的子元素之一。Choice元素用于指示任何子元素是有效的,但是只应选择一个,很像编程语言中的switch语句。

(1)属性(除非声明,所有的属性都是可选的):

(2)子元素:

Block、Choice、String、Number、Blob、Flags、Fixup、Transformer、XmlAttribute、XmlElement。

(3)例子:

一个基本的Choice。这个例子将破解或消耗1,2,3类型的数据,很像一个需要在令牌上做出决定的常规切换语句。它的前8个字节是1,剩下的数据被视为一个32位数字。如果前8位是2,剩下的数据被视为一个255字节的二进制数据。如果前8位是3,剩下的数据被视为一个8字节字符串。当fuzzing时,Peach将选择其中的1个类型并进行fuzzing,它的输出为一个8位数字,后跟相应的类型。Peach将会尝试所有的3个类型。


enter description hereenter description here

一系列的Choice。第一个例子适合构建单个Choice,但如果有许多Type1 、Type2和Type3块都是彼此跟随的,该怎么做呢?。通过设置minoccurs、maxoccurs或者occurs属性,可以指定Choice应该被重复。这个例子尝试来破解至少3个,最多6不同的Choice。


enter description hereenter description here

1.5、 Flags

Flags定义了一组Flag的大小。

(1)属性:

(2)子元素:

(3)例子

enter description hereenter description here

1.6、 Number

该元素定义了长度为8,16,24,32,或64位长度的二进制数。它是DataModel、Block或者Choice的子元素。

(1)属性:

(2)有效子元素:

(3)例子:

有符号。为了表明这是一个无符号数据元素,设置signed属性等于“false”。默认为真。


enter description hereenter description here

Value类型。值类型定义了怎么解释Value的属性。有效选项为string和hex,默认为string。将值1000分配给Hi5。


enter description hereenter description here

将43981以十六进制形式分配给Hi5。


enter description hereenter description here

小端。为了改变Number的字节顺序,请设置endian属性。


enter description hereenter description here

上图将产生如下字节顺序:AB CD。


enter description hereenter description here
上图将产生如下字节顺序:CD AB。

1.7、Padding

Padding元素用来填充大小变化的块或数据模型。

(1)属性:

(2)有效子元素:

(3)例子:

enter description hereenter description here

1.8、 String

该元素定义了一个单字节或者双字节的字符串,它是DataModel或者Block的子元素。为了指定这是一个数值的字符串,请用 NumericalString元素。

(1)属性:

(2)有效子元素:

Analyzer、Fixup、Relation、Transformer、Hint。

(3)NumericalString:

enter description hereenter description here

该元素只能用于String来说明它的值是一个数字。当使用这个提示时,它激活所有的数字突变以及标准的字符串突变。请注意:如果默认情况下一个字符串的值是数字,NumericalString元素被自动添加。


enter description hereenter description here

1.9、 Relation

Peach允许构建数据间的关系。关系是类似这样的东西“X是Y的大小”、“X是Y的数量”、或者“X是y的偏移(字节单位)”。

(1)大小关系:

enter description hereenter description here

在这个例子中,我们将提供两个python表达式,它允许在获取或设置size属性的时候修改它的大小,有两个变量可用,分别为self和size。Self是Number元素的一个引用,size是一个整数。获取操作和设置操作应该是彼此的数学逆操作。在破解过程中应用获取操作,在发布过程中应用设置操作。
expressionGet---该表达式的结果用于内部,它确定名字为TheValue的String元素读取多少字节。如果Peach取10,它将在内部存储一个5,然后Peach将读取5个字节到String中。
ExpressionSet---为 publisher生成一个值。 在以下示例中,为TheValue存储的Size的值“5”(TheValue的长度),因此Peach通过publisher输出的值将为“5 * 2”或10。


enter description hereenter description here

(2)数量关系:

在这个例子中,Number将会说明String列表的数目。

enter description hereenter description here
在这个例子中,我们将提供两个python表达式,它允许在获取或设置size属性的时候修改它的大小。有两个变量可用,分别为self和count。Self是Number元素的一个引用,count是一个整数。这里的让count可用与前面的表达式不同。虽然self在表达式对中始终可用,但其他可用的变量的名字是Relation元素type属性的值。
expressionGet---该表达式的结果用于内部,它确定String元素将扩展到多少项。maxOccurs 是Peach循环计算中遇到的最大值,由于maxOccurs = 1024的限制,Peach在CountIndicator元素中破解时遇到的最大值是2048。
ExpressionSet---设置要生成的值。 以下示例中,count根据读入的String元素数目确定。
enter description hereenter description here

(3)偏移关系:

todo

Todo

Fixup
Transformers
Placement

上一篇 下一篇

猜你喜欢

热点阅读