-
-
[原创]文件Fuzz教程之一:Peach语法介绍
-
发表于:
2013-7-31 16:43
13310
-
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>
<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 name="HelloWorld">
<String value="Hello world!" />
</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 name="PngChunks">
<Block name="IHDRChunk">
<!-- ... -->
</Block>
<Block name="PLTEChunk">
<!-- ... -->
</Block>
<Block name="IENDChunk">
<!-- ... -->
</Block>
</Choice>
<String value="Hello World!" />
<String value="Null terminated string" nullTerminated="true" />
<Number size="16" signed="false" endian="big" />
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课