开源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(测试配置)
具体文件结构如下:
类型信息,关系(大小,计数,偏移)、可嵌套等<\DataMode>
测试逻辑,状态转换
监视被测目标的情况,崩溃信息等
指定使用哪个StateModel,Agent,Publisher、Strategy、Logger等
一、 数据模型(data modeling)
1.1 Data Model
(1)属性:
- Name---必须的。当引用模型或者调试时,友好的DataModel名字是非常有用的。
- Ref---可选的。引用一个DataModel模板。
- Mutable---可选的,默认为真。该元素是否可变异。
- Constraint---可选的。确定一个表达式,它帮助Peach确定数据元素是否已被适当的消耗。
(2)子元素:
- Block、
- Choice、
- Custom、
- Flag、
- Flags、
- Number、
- Padding、
- String、
- XmlAttribute、
- XmlElement、
- Relation、
- Fixup、
- Transformer、
- Placement
(3)例子:
当一个DataModel被解析时,自定义DataModel看起来像是两个数据模型的组合,如下所示:
一个Peach文件中可以指定任意多个DataModel元素,但每个DataModel的名字必须唯一。通过DataModel可以将复杂的格式按照逻辑分解为更小的模型,使数据模型更易阅读、调试和重用。一个名字为“HelloWorld”的DataModel包含一个字符串和输出“Hello World!”如下所示:
1.2、 Blob
Blob元素是DataModel或Block的一个子元素。Blob元素常常用于代表缺少类型定义或格式的数据。如下所示:
(1)属性(除非声明,所有的属性都是可选的):
- Name---必须的。Blob的名字。
- Value---含有Blob的默认值。
- Length---Blob的大小,单位为字节。
- Ref---引用一个数据模型来作为Blob的模板。
- valueType---默认格式的值,hex,string,或者literal,默认为string。
- minOccurs---该Blob元素必须发生变化的最小次数,默认为1。
- maxOccurs---该Blob元素能够发生变化的最大次数,默认为1。
- Token---当解析时该元素应该作为一个令牌来信任,默认是假。
- lengthType---长度的类型,指定长度。
- Constraint---一个约束的形式表达,用于数据破解。
- Mutable---Blob元素是否可变异(是否能被fuzzing),默认为真。
(2)子元素:
- Anayzers
(3)例子:
一个简单的Blob。这个Blob中,任何类型或长度的数据能破解。
1.3、 Block
与DataModel 类似
Block是DataModel或Block元素的子元素。Block用于在一个逻辑结构中将一个或者多个数据元素(Number或String)组织在一起,它和Datamodel非常相似,仅有的差异是它们的位置。DataModel是个顶层元素,Block是DataModel的一个子元素,它们都可以作为其他Block或DataModel的模板。
(1)属性(除非声明,所有的属性都是可选的):
- Name---Block的名字。
- Ref---引用一个数据模型来作为Block的模板。。
- minOccurs---该Block必须发生变化的最小次数。
- maxOccurs--该Block可以发生变化的最大次数。
- Mutable---元素是否可变异,默认为真。
(2)子元素:
Blob、 block、 Choice、 Custom、 Fixup、 Flag、 Flags、 Number、 Padding、Placement、 Relation、Seek、 String、 Transformer、 XmlAttribute、 XmlElement。
(3)例子:
嵌套的Block。Block可以根据需要多层的嵌套,它可以帮助创建逻辑结构而不改变数据包含的内容。
这个嵌套的Block定义产生的输出为:1 2 3 4 。
引用属性允许构建健壮的模板,如下所示模板的名字为“Key”,值为“\r\n”。
使用该模板作为一个引用
输出为:
两个关键字符串在这里发生冲突。当解析时,自定义的Block将代替它的DataModel模板的结构。添加字符串值“:\r\n”。同时“customized”将覆盖String元素的“Key”和“Value”的值,用“Content-Length”和55代替。最终的DataModel将被解析如下:
1.4、 Choice
Choice是DataModel或者Block元素的的子元素之一。Choice元素用于指示任何子元素是有效的,但是只应选择一个,很像编程语言中的switch语句。
(1)属性(除非声明,所有的属性都是可选的):
- Name---choice元素的名字。
- minOccurs---该Choice必须发生改变的最小次数。
- maxOccurs---该Choice能发生改变的最大次数。
- Occurs---该choice能发生改变的迭代次数。
(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个类型。
一系列的Choice。第一个例子适合构建单个Choice,但如果有许多Type1 、Type2和Type3块都是彼此跟随的,该怎么做呢?。通过设置minoccurs、maxoccurs或者occurs属性,可以指定Choice应该被重复。这个例子尝试来破解至少3个,最多6不同的Choice。
1.5、 Flags
Flags定义了一组Flag的大小。
(1)属性:
- Name---可选的。元素的名字。
- Size---必须的。大小,以位为单位。
- Mutable---可选的。元素是否可以变异,默认为真。
(2)子元素:
- Fixup、Flag、Placement、Relation、Transformer。
(3)例子
1.6、 Number
该元素定义了长度为8,16,24,32,或64位长度的二进制数。它是DataModel、Block或者Choice的子元素。
(1)属性:
- Name---必须的。Number的名字。
- Size---必须的。Number的大小,以位为单位。有效值为1到64。
- Value---分配给Number的默认值。
- valueType---可选的。value的表现方式。有效选项为string(字符串)和hex(十进制)。
- Token---当解析的时候,该元素被视为一个令牌,默认值为假。有效选项为真和假。
- Endian---Number的字节顺序。默认为小端。有效选项为大端、小端和网络。网络一样是大端。
- Signed---Number是否为有符号数据。默认为真。有效选项为真和假。
- Constraint---一个以Python表达式为形式的约束。用于数据破解。
- Mutable---元素是否可改变(fuzzing时是否可变异),默认为真。有效选项为真和假。
- minOccurs---Number必须发生改变的最小次数,默认为1。有效选项为正整数值。
- maxOcuurs---Number能够发生改变的最大次数,没有默认值。有效选项为正整数值。
(2)有效子元素:
- Anayzers、Fixup、Relation、Transformer、Hint。
(3)例子:
有符号。为了表明这是一个无符号数据元素,设置signed属性等于“false”。默认为真。
Value类型。值类型定义了怎么解释Value的属性。有效选项为string和hex,默认为string。将值1000分配给Hi5。
将43981以十六进制形式分配给Hi5。
小端。为了改变Number的字节顺序,请设置endian属性。
上图将产生如下字节顺序:AB CD。
上图将产生如下字节顺序:CD AB。
1.7、Padding
Padding元素用来填充大小变化的块或数据模型。
(1)属性:
- Name---必须的。Number元素的名字。
- Aligned---将父元素对齐到8字节边界,默认为假。
- Alignment---对齐到这个位边界,比如(8、16等),默认为8。
- alignedTo---基于我们要填充的元素名字。
- Lengthcalc---计算结果为整数的脚本表达式。
- Constraint---一个以Python表达式形式的约束。用于数据破解。
- Mutable---元素是否可变异,默认为真,有效选项为真和假。
(2)有效子元素:
- Fixup、Relation、Transformer、Hint。
(3)例子:
1.8、 String
该元素定义了一个单字节或者双字节的字符串,它是DataModel或者Block的子元素。为了指定这是一个数值的字符串,请用 NumericalString元素。
(1)属性:
- Name---可选的,数据模型的名字。
- Length---可选的,字符串的长度。
- lengthType---可选的,Length属性的单位。
- Type---可选的。字符编码类型,默认为“ASCII”,有效选项为ASCII、utf7、utf8、utf6、utf6be、utf32。
- nullTerminated---可选的。是否为以空字节结尾的字符串(真或者假)。
- padCharacter---可选的。根据length参数填充字符串的字符,默认为(0x00)。
- Token---可选的。当解析的时候,该元素应该被视为一个令牌,默认为假。
- Constraint---一个脚本表达式形式的约束。用于数据破解。
- Mutable---可选的。元素是否可变异,默认为真。
- Minoccurs---可选的。这个块必须发生改变的最小次数,默认为1。
- Maxoccurs---可选的。这个块会发生改变的最大次数,默认为1。
(2)有效子元素:
Analyzer、Fixup、Relation、Transformer、Hint。
(3)NumericalString:
该元素只能用于String来说明它的值是一个数字。当使用这个提示时,它激活所有的数字突变以及标准的字符串突变。请注意:如果默认情况下一个字符串的值是数字,NumericalString元素被自动添加。
1.9、 Relation
Peach允许构建数据间的关系。关系是类似这样的东西“X是Y的大小”、“X是Y的数量”、或者“X是y的偏移(字节单位)”。
(1)大小关系:
在这个例子中,我们将提供两个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。
(2)数量关系:
在这个例子中,Number将会说明String列表的数目。
在这个例子中,我们将提供两个python表达式,它允许在获取或设置size属性的时候修改它的大小。有两个变量可用,分别为self和count。Self是Number元素的一个引用,count是一个整数。这里的让count可用与前面的表达式不同。虽然self在表达式对中始终可用,但其他可用的变量的名字是Relation元素type属性的值。
expressionGet---该表达式的结果用于内部,它确定String元素将扩展到多少项。maxOccurs 是Peach循环计算中遇到的最大值,由于maxOccurs = 1024的限制,Peach在CountIndicator元素中破解时遇到的最大值是2048。
ExpressionSet---设置要生成的值。 以下示例中,count根据读入的String元素数目确定。
(3)偏移关系:
todo
Todo
Fixup
Transformers
Placement