首页
论坛
专栏
课程

[原创]文件Fuzz教程之一:Peach语法介绍

2013-7-31 16:43 4556

[原创]文件Fuzz教程之一:Peach语法介绍

2013-7-31 16:43
4556
RT
文件Fuzz教程第一篇

文件 Fuzz 教程之一:Peach 语法介绍
Author:dragonltx

如果这是你第一次听说 Peach 这个 Fuzz 框架,你可以先看下 Peach 项目的主页

扬帆起航
在我们开始之前,我们需要以下的工具来进行辅助。

Peach Fuzzing Framework
如果你在使用中,出现 bug,可以到 Peach 这个项目的 svn 上拉取最新的代码。

010 Binary Editor
010 Binary Editor 是一款文件格式解析利器。这个工具可以帮助我们调试 Peach Pit文件。你可以在这里下载这个软件。

Peach 结构
为了开始进行文件 Fuzz,首先必须创建一个该格式的 Peach Pit 文件。Peach Pit 文件是基于
XML 格式,里面记录了文件格式的组织方式,我们需要如何进行 Fuzz,Fuzz 的目标等信息。
一个 Peach Pit 包含如下 5 个元素:

DataModel
DataModel 是用来定义数据结构的元素,我们可以在里面定义哪些结构需要进行Fuzz,哪些结构不需要进行 Fuzz。

StateModel
StateModel 负责管理 Fuzz 过程的执行流。

Agents
Agents 用来监视 Fuzz 过程中程序的行为,可以捕获程序的 crash 信息。

Test Block
Test Block 负责将 StateModel 和 Agents 等联系到一个单一的测试用例里。

Run Block
Run Block 负责定义 Fuzz 过程中哪些 Test 会被执行。这个块也会记录 Agent 产生的信息。

Peach 语法
本节将重点介绍 DataModel 的语法使用。一个 Peach Pit 文件至少会包括一个 DataModel 或
者更多。DataModel 描述了类型信息、关联性信息和其他让 Fuzzer 进行智能变异的信息。
DataModel 可以重用或者被其他的 DataModel 引用,这就使得复杂的数据结构可以被拆分,
增加了可读性。
DataModel 主要包括如下元素:

DataModel
Block
Choice
String
Number
Blob
Flags
Relation

DataModel
DataModel 元素是 Peach 根元素的子节点。DataModel 定义了数据块的结构,它会声明像Number 和 String 等子元素。
<DataModel name="HelloWorld">
         <String value="Hello world!" />
</DataModel>


属性:
name-数据模型的名字[必须]
ref-引用模版数据模型[可选]
pointer--(Peach2.3),没用过,详见链接[可选]
pointerDepth-(Peach2.3),没用过,详见链接[可选]

有效的子元素:
Block
Choice
String
Number
Blob
Flags
Fixup
Relation
Transformer

可以在一个 Peach Pit 文件里指定任意数目的 DataModel,一般复杂的数据结构都会拆成几部
分,增强可读性和可重用性。

如果使用了引用(ref 属性),那么被引用的 DataModel 将为作为新的 DataModel 的基数据。
任意一个 DataModel 会被同名的 DataModel 覆盖。
<DataModel name="Template">
    <String name="Key" />
    <String value=": " token="true" />
    <String name="Value" />
    <String value="\r\n" token="true" />
</DataModel>


<DataModel name="Customized" ref="Template">
    <String name="Key" value="Content-Length" />
    <String name="Value">
        <Relation type="size" of="HttpBody" />
    </String>
</DataModel>


Block
Block 元素是 DataModel 或者 Block 的子元素。Block 是用来组合一个或者多个的其他元素,
比如 Number 或者 String。Block 和 DataModel 是很类似的,唯一的区别就是它们的位置。
Block 和 DataModel 都可以被用作 Block 和 DataModel 的“模版”。
<Block name="HelloWorld">
    <String value="Hello world!" />
</Block>


属性:
name-元素的名字[必须]
ref-引用模版数据模型[可选]
minOccours-这个 Block 所必须出现的最低次数[可选]
maxOccours-这个 Block 可能会出现的最高次数[可选]
length-这个 Block 的长度[可选]
lengthType-长度的类型,长度是如何计算的[可选]
pointer--(Peach2.3),没用过,详见链接[可选]
pointerDepth-(Peach2.3),没用过,详见链接[可选]
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

有效的子元素:
Block
Choice
String
Number
Blob
Flags
Fixup
Relation
Transformer

如果使用了引用(ref 属性),那么被引用的 Block 将为作为新的 Block 的基数据。任意一个
Block 会被同名的 Block 覆盖。
<DataModel name="Template">
    <String name="Key" />
    <String value=": " token="true" />
</DataModel>
<DataModel name="OtherModel">
    <String value="Hello World!" />
    <Block name="Customized" ref="Template">
        <String name="Key" value="Content-Length" />
        <String name="Value">
            <Relation type="size" of="HttpBody" />
        </String>
    </Block>
</DataModel>


Choice
Choice 元素是 DataModel 或者 Block 的子元素。Choice 元素是用来指定任意一个子元素是有
效的,并且之能选择其中一个。就像 C 语言里的 switch 语法。
<Choice name="PngChunks">
    <Block name="IHDRChunk">
        <!-- ... -->
    </Block>
    <Block name="PLTEChunk">
        <!-- ... -->
    </Block>
    <Block name="IENDChunk">
        <!-- ... -->
    </Block>
</Choice>


属性:
name-元素的名字[可选]
minOccours-这个 Block 所必须出现的最低次数[可选]
maxOccours-这个 Block 可能会出现的最高次数[可选]
pointer--(Peach2.3),没用过,详见链接[可选]
pointerDepth-(Peach2.3),没用过,详见链接[可选]
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

有效的子元素:
Block
Choice
String
Number
Blob
Flags
Fixup
Transformer

String
String 元素定义一个或者双字节的字符串。String 元素是 DataModel 或者 Block 的子元素。
<String value="Hello World!" />


<String value="Null terminated string" nullTerminated="true" />


属性:
name-元素的名字[可选]
minOccours-这个 Block 所必须出现的最低次数[可选]
maxOccours-这个 Block 可能会出现的最高次数[可选]
isStatic-解析时,这个元素会被当作 token,默认是 False[可选]
token-(Peach2.3)解析时,这个元素会被当作 token,默认是 False[可选]
length-字符串的长度[可选]
nullTerminated-字符串是以 null 结尾[可选]
padCharacter-填充字符串,来填充达到 length 的长度,默认是 0x00[可选]
pointer--(Peach2.3)没用过,详见链接[可选]
pointerDepth-(Peach2.3)没用过,详见链接[可选]
constraint-(Peach2.3)Python 表达式,约束条件,在产生数据时用到[可选]
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

有效的子元素:
Relation
Fixup
Transformer
Hint

Number
Number 元素定义了长度为 8,16,24,32 或者 64 位的二进制数字。Number 元素是 DataModel、
Block 或者 Choice 的子元素。
<Number size="16" signed="false" endian="big" />


属性:
name-元素的名字[必须]
ref-引用的数据类型[可选]
minOccours-这个 Block 所必须出现的最低次数[可选]
maxOccours-这个 Block 可能会出现的最高次数[可选]
isStatic-解析时,这个元素会被当作 token,默认是 False[可选]
token-(Peach2.3)解析时,这个元素会被当作 token,默认是 False[可选]
size-Number 的大小,以位数为单位。有效的选择是 8,16,24,32 和 64[可选]
endian-数字的字节顺序,默认是小端字节[可选]
signed-是否是有符号[可选,默认是 true]
pointer--(Peach2.3)没用过,详见链接[可选]
pointerDepth-(Peach2.3)没用过,详见链接[可选]
constraint-(Peach2.3)Python 表达式,约束条件,在产生数据时用到[可选]
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

有效的子元素:
Relation
Fixup
Transformer
Hint

Blob
Blob 元素是 DataModel 或者 Block 的子元素。Blob 是用来定义不明类型的数据。
<Blob name="Unknown1" valueType="hex" value="01 06 22 03"/>


属性:
name-元素的名字[可选]
ref-引用的数据类型[可选]
minOccours-这个 Block 所必须出现的最低次数[可选]
maxOccours-这个 Block 可能会出现的最高次数[可选]
isStatic-解析时,这个元素会被当作 token,默认是 False[可选]
token-(Peach2.3)解析时,这个元素会被当作 token,默认是 False[可选]
value-Blob 包含的默认值
valueType-默认值的表达形式(如 hex、string 等),默认是 string
length-Blob 的大小,以字节为单位[可选]
lengthType-长度的类型,长度是如何计算的[可选]
pointer--(Peach2.3)没用过,详见链接[可选]
pointerDepth-(Peach2.3)没用过,详见链接[可选]
constraint-(Peach2.3)Python 表达式,约束条件,在产生数据时用到[可选]
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

Flags
Flags 定义了一些以位为单位的集合。
<Flags name="options" size="16">
    <Flag name="compression" position="0" size="1" />
    <Flag name="compressionType" position="1" size="3" />
    <Flag name="opcode" position="10" size="2" value="5" />
</Flags>


属性:
name-元素的名字[可选]
size-大小,以位数为单位[必须]
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

Flag
Flag 元素在 Flags 容器中定义了一些位域。
<Flags name="options" size="16">
    <Flag name="compression" position="0" size="1" />
    <Flag name="compressionType" position="1" size="3" />
    <Flag name="opcode" position="10" size="2" value="5" />
</Flags>


属性:
name-元素的名字[可选]
size-大小,以位数为单位[必须]
position-flag 的起始位置(以 0 为基准)[必须]
value-Blob 包含的默认值
valueType-默认值的表达形式(如 hex、string 等)
mutable-(Peach2.3)这个数据元素是否可变,默认是 TRUE[可选]

Relation
Peach 允许数据间的关系建模。关系像“X 是 Y 的大小”,“X 是 Y 出现的次数”,或者“X
是 Y 的偏移(以字节为单位)”。

size-of Relation
这个例子里,Number 会指定 Value 字符串的大小,以字节为单位。注意,这对多字节字符
(wchar)同样试用。在以后的 Peach 版本里,一个新的长度类型将会更好的支持 UTF-8 和
其他的 Unicode 编码。
<Number size="32" signed="false">
     <Relation type="size" of="Value" />
</Number>
<String name="Value" />


和 expressionGet/expressionSet 搭配这个例子中,我们将会介绍两种 Python 表达式,可以允许我们动态修改大小。expressionGet-这个指用来决定 Value 需要读入多少字节。expressionSet-设置将要产生的指。下面的例子中,size 将会是 5,因此 Publisher 将会产生的值是 2*5。
<Number size="32" signed="false">
    <Relation  type="size"  of="Value"  expressionGet="size/2"  expressionSet="size*2" />
</Number>
<String name="Value" />


count-of Relation
这个例子里,Number 会指定 Strings 数组的个数。

<Number size="32" signed="false">
    <Relation type="count" of="Strings" />
</Number>
<String name="Strings" nullTerminated="true" maxOccurs="1024" />


和 expressionGet/expressionSet 搭配跟 size-of Relation 一样,参考上面的例子。

When Relation
When 这个关系用来决定一个元素是否用。
<Block name = "IsEven" minOccurs="0" maxOccurs="1">
<Relation type="when" when="(int(self.find('cbFileSize').getInternalValue())%2) ==
0"/>
<Blob lengthType="calc" length="int(self.find('cbFileSize').getInternalValue())" />
</Block>


注:本帖由看雪论坛志愿者PEstone 重新将PDF整理排版,若和原文有出入,以原作者附件为准

[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上传的附件:
上一主题 下一主题
最新回复 (6)
linhanshi 2013-8-1 13:14
2
0
+1
topofall 2013-8-1 13:34
3
0
好东西,收藏mark
lisalan 2013-8-1 14:28
4
0
+3
学者learner 2013-8-1 21:22
5
0
不错,顶一下。
AJISky 7 2013-8-3 11:23
6
0
有些地方感觉讲解的还是不够仔细,不知道是不是自己的原因。
比如那个介绍expressionSet的地方,没有提到size=5如何而来
怎么就成了expressionSet="size*2" 即为5*2呢
mywxc 2013-9-7 23:38
7
0
座沙发,慢慢看!!
游客
登录 | 注册 方可回帖
返回