安全-peach测试

开源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)属性:

  • 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例子
引用冲突例子
引用冲突例子

当一个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嵌套
Block嵌套

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

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


enter description here
enter description here

使用该模板作为一个引用


enter description here
enter description here

输出为:
enter description here
enter description here

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


enter description here
enter description here

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个类型。


enter description here
enter description here

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


enter description here
enter description here

1.5、 Flags

Flags定义了一组Flag的大小。

(1)属性:

  • Name---可选的。元素的名字。
  • Size---必须的。大小,以位为单位。
  • Mutable---可选的。元素是否可以变异,默认为真。

(2)子元素:

  • Fixup、Flag、Placement、Relation、Transformer。

(3)例子

enter description here
enter description here

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”。默认为真。


enter description here
enter description here

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


enter description here
enter description here

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


enter description here
enter description here

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


enter description here
enter description here

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


enter description here
enter description here

上图将产生如下字节顺序: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)例子:

enter description here
enter description here

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:

enter description here
enter description here

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


enter description here
enter description here

1.9、 Relation

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

(1)大小关系:

enter description here
enter 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 here
enter description here

(2)数量关系:

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

enter description here
enter 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 here
enter description here

(3)偏移关系:

todo

Todo

Fixup
Transformers
Placement

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,864评论 6 13
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,828评论 0 0
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock阅读 3,370评论 2 36
  • 曹禺在【雷雨.序】 中写的话: 我念起人类是怎样可怜的动物,带着踌躇满志的心情仿佛自己来主宰自己的...
    暗夜撄宁阅读 399评论 0 0