目录

1 Peach是什么…………………………………………………………………………………………………… 4

1.1 Peach的历史………………………………………………………………………………………….. 4

2 安装……………………………………………………………………………………………………………… 4

2.1 安装Peach 3………………………………………………………………………………………….. 4

2.2 安装二进制发行版………………………………………………………………………………….. 4

3 教程……………………………………………………………………………………………………………… 5

3.1 Peach 3 快速开始……………………………………………………………………………………. 5

3.2 Dumb Fuzzing………………………………………………………………………………………….. 5

3.2.1 开发环境……………………………………………………………………………………… 5

3.2.2 创建数据模型……………………………………………………………………………….. 6

3.2.3 创建状态模型……………………………………………………………………………….. 6

3.2.4 配置Publisher……………………………………………………………………………….. 7

3.2.5 添加代理和监视器…………………………………………………………………………. 7

3.3 File Fuzzing……………………………………………………………………………………………. 10

3.3.1开发环境…………………………………………………………………………………….. 11

3.3.2创建数据模型………………………………………………………………………………. 11

3.3.3创建状态模型………………………………………………………………………………. 19

3.3.4配置Publisher……………………………………………………………………………….. 19

3.3.5添加代理和监视器………………………………………………………………………… 20

3.3.6优化测试计数………………………………………………………………………………. 22

3.3.7并行运行…………………………………………………………………………………….. 22

4 方法论………………………………………………………………………………………………………… 23

5 介绍……………………………………………………………………………………………………………. 24

5.1 Peach介绍……………………………………………………………………………………………. 24

5.2 使用Peach进行Fuzzing………………………………………………………………………….. 24

6 训练……………………………………………………………………………………………………………. 25

6.1 Peach 训练…………………………………………………………………………………………… 25

6.2 会议训练…………………………………………………………………………………………….. 25

6.3 在线训练…………………………………………………………………………………………….. 25

6.4 训练大纲…………………………………………………………………………………………….. 25

7 Peach 3…………………………………………………………………………………………………………. 26

7.1 Peach Pits文件………………………………………………………………………………………. 26

7.2 通用配置…………………………………………………………………………………………….. 26

7.2.1 Include………………………………………………………………………………………… 26

7.2.2 Defaults………………………………………………………………………………………. 27

7.2.3 PythonPath…………………………………………………………………………………… 27

7.2.4 Import…………………………………………………………………………………………. 27

7.3数据模型……………………………………………………………………………………………… 27

7.3.1 DataModel…………………………………………………………………………………… 27

7.3.2 Blob……………………………………………………………………………………………. 29

7.3.3 Block…………………………………………………………………………………………… 29

7.3.4 Choice…………………………………………………………………………………………. 32

7.3.5 Custom……………………………………………………………………………………….. 33

7.3.6 Flag…………………………………………………………………………………………….. 33

7.3.7 Flags…………………………………………………………………………………………… 34

7.3.8 Number……………………………………………………………………………………….. 34

7.3.9 Padding……………………………………………………………………………………….. 35

7.3.10 String………………………………………………………………………………………… 36

7.3.11 XmlAttribute……………………………………………………………………………….. 36

7.3.12 XmlElement…………………………………………………………………………………. 37

7.3.13 Hint…………………………………………………………………………………………… 37

7.3.14 Relation……………………………………………………………………………………… 38

7.3.15 Fixup…………………………………………………………………………………………. 41

7.3.16 Transformers……………………………………………………………………………….. 41

7.3.17 Placement…………………………………………………………………………………… 43

7.4状态模型……………………………………………………………………………………………… 43

7.4.1 state…………………………………………………………………………………………… 43

7.4.2 Action…………………………………………………………………………………………. 44

7.4.3 状态模型例子……………………………………………………………………………… 48

7.5 代理…………………………………………………………………………………………………… 50

7.6 监视器………………………………………………………………………………………………… 54

7.6.1 windows监视器…………………………………………………………………………….. 54

7.6.2 OSX监视器…………………………………………………………………………………… 58

7.6.3 Linux监视器…………………………………………………………………………………. 59

7.6.4 跨平台监视器……………………………………………………………………………… 59

7.7 测试…………………………………………………………………………………………………… 66

7.8 Publishers……………………………………………………………………………………………… 67

7.8.1 网络Publishers…………………………………………………………………………….. 67

7.8.2 自定义Publishers………………………………………………………………………….. 67

7.8.3 Publishers…………………………………………………………………………………….. 67

7.9 Loggers………………………………………………………………………………………………… 78

7.10 变异策略…………………………………………………………………………………………… 78

7.10.1 随机…………………………………………………………………………………………. 78

7.10.2 有顺序的…………………………………………………………………………………… 79

7.10.3 随机确定性(默认)…………………………………………………………………… 79

7.11 变异器………………………………………………………………………………………………. 79

7.12 运行…………………………………………………………………………………………………. 80

7.12.1 命令行……………………………………………………………………………………… 80

7.12.2 图形化程序……………………………………………………………………………….. 80

7.13 最小集………………………………………………………………………………………………. 80

 


1 Peach是什么

Peach是一款智能模糊测试器(SmartFuzzer),它有两种模糊测试能力:基于生长的模糊测试和基于变异的模糊测试。Peach需要创建一些PeachPits文件,该文件定义了被模糊测试数据中的结构、类型信息和相互关系。此外,它允许为进行中的模糊测试进行配置,包含选择一个数据通道(Publisher)和登录接口等。Peach由
Deja vu Security公司的Michael Eddington创造并开发,主要开发工作已经有7年了,主要有3个版本。

1.1 Peach的历史

Peach V 1.0是一个由Python框架创造的fuzzer,于2004年完成开发,并公布于ph-neutral
0x7d4
网站上。Peach 2.0发布于2007年夏天,是第一款综合的开源fuzzing工具,包含进程监视和创建fuzzer,其中创建fuzzer由XML语言实现。Peach 3发布于2013年初,是一个全部重写的版本,它放弃了Python语言,改由Microsoft.NET框架来实现,主要是C#。Mono开源运行时促进了Peach的跨平台支持。

Peach不是开源软件,而是遵循MIT许可证的免费软件。和BSD许可证一样,MIT许可证在Peach的使用和修改上没有限制。

2 安装

2.1 安装Peach 3

以下章节列出了在不同操作系统上安装Peach所需的步骤。Peach 3利用Microsoft.NET和C#语言对Peach 2进行了完全的重写。和Peach
2相比,新版本的可利用特性非常相似,主要变化在于引擎。初步测试显示,Peach 3比Peach 2.3快3至4倍。

2.2 安装二进制发行版

Windows

1、安装Microsoft.NET 4 运行时。

2、安装windows调试工具(Windbg)。

3、将Peach二进制发行版解压到你个工作文件夹。

4、现在准备开始使用Peach 3!

在fuzzing网络协议时如果你想让网络捕获可用,请安装WireShark或者Winpcap。

OS X

1、安装最新版的Mono包。

2、安装Crash Wrangler。

3、将Peach二进制发行版解压到你个工作文件夹。

4、现在准备开始使用Peach 3!

Linux

1、安装最新的Mono包:Ubuntu/Debian安装mono完整包;SUSE安装请看Mono官网说明。

2、将Peach二进制发行版解压到你个工作文件夹。

3、现在准备开始使用Peach 3!

2.3
由源码构建Peach 3

Windows

1、安装Microsoft.NET 4 SDK。

2、安装Visual Studio 2010
SP1。

3、安装最新版本的Python 2。

4、将Peach源码解压到工作文件夹,或者用GIT工具下载最新的源码。

5、运行“waf.bat配置”。

6、运行“waf.bat安装”。

现在你将会看到一个包含有二进制文件的“output”文件夹。

OS X & Linux

1、安装带编译器的Mono。

2、将Peach源码解压到工作文件夹,或者用GIT工具下载最新的源码。

3、运行“waf.bat配置”。

4、运行“waf.bat安装”。

现在你将会看到一个包含有二进制文件的“output”文件夹。

3 教程

3.1 Peach 3 快速开始

以下教程为如何利用Peach 3开始fuzzing提供了信息。


Dumb Fuzzing


File Fuzzing

3.2 Dumb Fuzzing

欢迎来到dumb fuzzing教程。在这个教程中,我们将为PNG图像文件(.png)构建一个简单的dumb fuzzer。利用位翻转和双字节移位等方法,dumb fuzzer将会用一些样本文件(也叫种子文件)进行变异。 此次fuzzer的目标是windows系统中的mspaint、linux系统中的feh和OSX系统中的Safari。主要有以下几个步骤:

3.2.1 开发环境

在开始构建我们自己的Peach Fuzzer之前,先花一些时间来讨论一下正常的Peach开发环境。一个典型的开发环境如下所示:

(1)XML编辑器

一个好的XML编辑器绝对是必须的。Windows上一个好的免费XML编辑器是Microsoft Visual
Studio Express编辑器。如果你已经拥有了一款智能感知XML编辑,那样最好。

(2)最新版Peach

经常保持你使用的Peach版本为最新的。

(3)调试器和支持的工具

为了更好的进行fuzzing工作,需要以下工具的支持。Windows系统需要Windbg支持(最新可利用版本);OS X系统需要CrashWrangler支持(需要苹果开发者账号)。

3.2.2 创建数据模型

首先复制一个template.xml文件的副本,并重命名为png.xml,template.xml位于你的Peach文件夹中。这个文件保存着关于PNG dumb Fuzzer的所有信息。同样地,你也需要一些PNG样本(至少10个)。对于我们的dumb fuzzer,仅仅只需要一个数据模型,它保存着PNG文件的所有数据。这个数据模型并不知道PNG数据结构的任何信息,而是将所有的数据保持在一个“Blob”元素(二进制大对象或者字节数组)中。

创建DataModel元素

现在,用我们的XML编辑器打开png.xml,开始编辑它。定位到“DataModel”的位置,如下图所示:

 

想了解更多有关内容,请阅读DataModel章节。

在我们的数据模型中,将增加一个单独的数据元素,如下图所示:

 

想了解更多有关内容,请阅读DataModel章节和Blob章节。

到现在为止,这就是我们的数据模型所需的所有东西,“Blob”元素最终将保持所有的PNG数据。

3.2.3 创建状态模型

现在已经创建好了数据模型,接下来创建状态模型。对于文件fuzzing来说,状态模型非常简单。所有需要我们做的仅仅只是写文件和启动目标进程,我们将使用三个Action元素来实现这些功能,如下所示:

l  Output———写文件

l  Close———关闭文件

l  Call———启动应用程序

在png.xml文件中,定位到StateModel(名字为TheState),展开这个元素,并添加我们所需的三个Action,如下所示:

 

更多有关内容请阅读StateModel、State、Action、DataModel、Data等章节。

请注意,最后的“call”动作,有一个“publisher”属性,它的值为“Peach.Agent”。它的作用是给任何一个被配置的代理发送一个含有“LaunchViewer”的调用消息,这就是为什么调试监视器知道如何启动进程的原因。

非常好,状态模型已经全部配置好了,接下来需要做的是配置调试器和Publisher。

3.2.4 配置Publisher

进行fuzzing之前的最后一步是配置一个Publisher。Publishers是Peach的I/O连接,它是实现输出、输入和调用等操作之间的管道。对于文件fuzzer来说,将使用一个称之为文件的Publisher,它允许我们对一个文件进行写操作。配置一个Publisher是很容易的,它位于png.xml的底部附近,是Test标签的一个子标签。现在,这个Publisher有一个名字为FileName的唯一参数,该参数的值是被fuzzer文件的文件名,如下图所示:

 

接下来,我们将配置一种方式来探测目标程序什么时候崩溃。同样地,也要收集一些便于以后查看的相关信息,比如堆栈踪迹等等。下一节,将学习如何配置代理和监视器。

3.2.5 添加代理和监视器

(1)代理和监视器

现在开始配置代理和监视器。代理是特殊的Peach进程,它能够运行在本地进程中,也可以通过网络在远程运行。这些代理拥有一个或者多个监视器,用来执行调试器附加和查看内存消耗等之类的操作。本教程将为每个目标平台配置一些特定的Peach监视器。Windows将配置Windbg调试器和Heap调试器,Windbg用来监视mspaint.exe程序的异常和其他常见问题, Heap调试器用来调试目标进程;Linux将配置相应的调试器来监视系统中的核心文件;OSX将配置CrashWangler来监视Safari程序的异常和其他常见问题。

(2)配置代理和监视器

首先,要找到样本文件中的Agent元素,一般来说,该元素会有一些相关的注释,其大致情况如下图所示:

 

接下来,取消这部分的注释,并删除“location”属性。当没有“location”属性时,Peach会自动地开启一个本地Peach代理。本教程将配置三个代理,分别对应于Windows、Linux和OSX操作系统。Windows代理由Windows Debugger和PageHeap组成;Linux代理由LinuxDebugger组成;OSX代理由CrashWrangler组成,详细情况如下图所示:

 

 

更多详细内容请阅读Agent章节、WindowsDebugger章节和PageHeap章节。

(3)配置Test元素

接下来,需要启用我们刚刚配置的代理。找到Test元素,取消该行的注释,并修改我们的Launcher
publisher,如下图所示:

 

    更多详细内容请阅读Test章节。

(4)配置Fuzzing策略

由于要对许多文件进行dumb fuzzing,因此要更改Peach使用的默认fuzzing策略,以便更能满足本次实验的需求。最好的dumb fuzzing策略是随机策略,可以通过在Test元素中添加Strategy元素的方式来配置它,如下图所示:

 

(5)配置记录

现在,监视器正在探测程序的各种错误,因此,还需要一个信息记录机制来捕获fuzzer运行的结果,在XML文件底部的Test元素中添加logger元素就可以实现该机制。如下所示:

 

更多详细内容请阅读Test章节、Logger章节和File Logger章节。

(6)运行Fuzzer

现在让我开始正真的fuzzer之旅,每隔大约200次迭代,策略将切换一个不同的样本文件。在命令行中,运行“peach png.xml”开始fuzzing。

(7)下一步做什么

Fuzzing开始之后,我们下一步需要做以下几个工作:

l  收集额外的样本文件。

l  观察运行状态,删除导致重复代码路径的任何文件。

l  收集程序的bug信息

3.3 File Fuzzing

欢迎来到File fuzzing教程,在该教程中我们将构建一个wave文件(.wav)的模糊器。Wave文件基于RIFF文件格式,这种格式并不十分复杂,而且能够展示出Peach的几个特性。本次fuzzer的目标是mplayer,它是一款开源、跨平台和命令行形式的多媒体软件。

3.3.1开发环境

在开始构建我们自己的Peach Fuzzer之前,先花一些时间来讨论一下正常的Peach开发环境。一个典型的开发环境如下所示:

(1)XML编辑器

一个好的XML编辑器绝对是必须的。Windows上一个好的免费XML编辑器是Microsoft Visual
Studio Express编辑器。如果你已经拥有了一款智能感知XML编辑,那样最好。

(2)最新版Peach

经常保持你使用的Peach版本为最新的。

(3)调试器和支持的工具

为了更好的进行fuzzing工作,需要以下工具的支持。Windows系统需要Windbg支持(最新可利用版本);OS X系统需要CrashWrangler支持(需要苹果开发者账号)。

3.3.2创建数据模型

首先复制一个template.xml的副本(在你的Peach 文件夹中),并重命名为wav.xml,它保存着WAV模糊器的所有信息。同样地,你需要一个WAV样本,该网址可以获得:http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/Samples/AFsp/M1F1-int32WE-AFsp.wav。

现在,你需要查看以下两个规范来了解一下WAV格式:

http://www.sonicspot.com/guide/wavefiles.html

l  RIFF文件规格说明(微软)。

如果曾经留意过WAV文件格式,你会发现WAV文件由一个文件头组成,其后跟着很多的Chunk,这种形式对于文件格式和数据包来说是非常普遍的。典型地来说,每个Chunk的格式相同,它遵循某种形式的T-L-V或类型长度值。事实上,WAV文件Chunk也是这样,类型后紧跟着是长度,长度后紧跟着是数据。每个Chunk类型定义了其后紧跟的数据的含义。

基于以上信息,就能构建出所需的模糊器,它有几个顶层的”“DataModel”元素,名字分别为:Chunk、ChunkFmt、ChunkData、ChunkFact、ChunkCue、ChunkPlst、ChunkLabl、ChunkLtxt、ChunkNote、ChunkSmpl、ChunkInst、Wav。名为Chunk的“DataModel”元素是以下每种类型Chunk的模板,我们将它们放在一起。名为Wav的“DataModel”用来定义文件头。

(1)Number元素的默认设置

WAV中用到的大多数字是无符号型的。在PIT文件中添加XML元素来设置默认值。如下图所示:

 

(2)创建Wav DataModel

回到wav.xml文件,开始编辑相关的XML元素。找到名字为“TheDataModel”的DataModel元素,如下图所示。更多该元素的细节请阅读DataModel章节。

 

将该元素的名字重命名为Wav。根据wav文件规范,在Peach文件中定义文件头如下图所说。其中,wav文件的文件头格式为:

l  文件魔术数:4字符串,一般为“RIFF”。

l  文件长度:32位无符号整数。

l  RIFF类型:4字符串,一般为“WAVE”。

 

 

(3)Chunk DataModel

Chunk DataModel是Peach Pit文件中的第一个DataModel,所以将它放在Wav
DataModel之前,如下图所示。更多详细内容请阅读DataModel章节、String章节和Number章节。

 

Chunk DataModel在Wav DataModel之前,这是非常重要的,稍后我们会引用这个DataModel,而且使用它之前必须先定义。根据wav文件规范,Chunk的格式如下:

l  ID:4字符串,用空格填充。

l  Size:4字节无符号整数。

l  数据:字节数据,大小取决于Size参数的值

 

因此,我们可以进行相应的定义,如上图所示。
更多详细内容请阅读DataModel章节、String章节、Number章节、Relation章节、Blob章节和Padding章节。

现在,我们已经创建了Size参数和Data参数之间的大小关系,这样Size参数自动更新时,会产生相应大小的Data参数。当用一个样本文件作为默认值进行解析时,解析器根据Size参数的值就能找到相应的Data部分。现在我们可以用一个Padding类型来正常地填充自己的DataModel。注意,alignment属性的值为16,这说明Padding元素能够自己调整大小,Chunk
DataModel以16位(2字节)的边界结束。

(4)Format Chunk

现在来定义Format Chunk的细节。使用已经定义过的通用Chunk作为模板,只需要指定Format Chunk的细节和保存一些版式。根据wave规范,Format Chunk的格式如下:

l  ID:通常为“fmt”。

l  Data:

u  压缩代码:16位无符号整数。

u  声道数目:16位无符号整数。

u  采样率:32位无符号整数。

u  平均每秒所需字节数:32位无符号整数。

u  块对齐单位:16位无符号整数。

u  每个采样所需的位数:16位无符号整数。

u  附加信息:16位无符号整数。

ChunkFmt DataModel位于Chunk
DataModel之后和Wav DataModel之前,如下图所示。更多详细内容请阅读DataModel章节、Block章节、String章节、Number章节和Blob章节。

 

在这里,你会发现一些非常酷的事情。首先,查看DataModel元素,你会发现一个名字为ref的属性,它的值是Chunk,这是告诉Peach复制Chunk DataModel,并以它为基础来产生新的ChunkFmt
DataModel,Chunk DataModel中的所有元素都默认出现在新的ChunkFmt DataModel中,这说明Peach中的Chunk可以重用。其次,还发现ChunkFmt
DataModel中有两个元素和Chunk DataModel中的两个元素名字相同,分别为ID和Data,这会让新元素替代旧元素。这就允许我们根据新格式Chunk类型的需要,对旧元素进行重写。

现在,你也许会问为什么要对元素ID进行重写?这是个不错的问题,重写元素ID是为了指定新格式Chunk需要的静态字符,稍后我们将会指定一个样本wav文件来使用,解析器需要提示怎样选择正确的chunk。更多细节会在后面的Choice元素部分来介绍。

(5)Data Chunk

接下来是Data Chunk。这个很容易,因为数据包的数据部分没有结构。我们可以这样定义这个Chunk,如下图所示。更多详细内容请阅读DataModel章节和String章节。

 

(6)Fact Chunk

好了,现在我们来看Fact Chunk。这个块的格式如下:

l  ID:“fact”,字符串,4个字符。

l  Data:

u  样本数目:32位无符号整数。

u  未知?:未知字节。

又一个非常容易定义的块,如下图所示:

 

更多详细内容请阅读DataModel章节、Block章节、String章节、Number章节和Blob章节。请注意,我比较懒,没有为Number元素和Blob元素取名字,Peach不需要所有的元素都有名字,只要被引用的元素有名字就行。

(6)Wave List Chunk

Wave List Chunk有些不同,它由一个列表里的silent
chunk和data chunk交替组成。因此,在完成wave list chunk之前,我们需要先定义silent
chunk。Silent chunk非常简单,它仅仅是一个4字节的无符号整数,数据模型定义如下:。更多详细内容请阅读DataModel章节、Block章节、String章节和Number章节。

 

这就是我们获得wave list chunk的方式。Data部分是一个由silent chunk和data chunks构成的列表。下图显示了我们是如何做的。更多详细内容请阅读DataModel章节、Block章节和String章节。

 

该定义介绍了列表或者重复元素的概念。请注意,block元素有个maxOccurs属性。它告诉Peach该block可能发生至少1次,最多3000次变化。同时也要注意到,我们使用了block元素的ref属性,它和我们重用数据模型内部数据的原理是一样的,不是很难理解。

(7)Cue Chunk

这个块比较简单,也是一个列表。由以下几部分组成:

l  ID:4字节。

l  位置:4字节无符号整数。

l  数据Chunk ID:4字节RIFFID。

l  Chunk开始:4字节无符号整数的数据块偏移。

l  Block开始:4字节的无符号整数,偏移到第一个声道的采样。

l  采样偏移:4字节无符号整数,偏移到第一张声道的采样字节。

不用担心最后3个数字是偏移的事实。这个数据已经在wave
list chunk中解析,只需要读取它们就行了。定义如下:

 

更多详细内容请阅读DataModel章节、Block章节、String章节和Number章节。

不要有任何惊讶,我们只是在重用之前的例子。再说一次,不会给每个东西都取名字。

(8)Playlist Chunk

Playlist Chunk 的Data同样是由一个列表组成,但是列表的数目包含在列表之前。我们将使用一个数目的关系来构建模型。

 

更多详细内容请阅读DataModel章节、Block章节、String章节、Number章节

和Relation章节。

(9)Associated Data
List Chunk

这个Chunk由一系列的Label Chunks、Name Chunks和Text Chunks组成。由于不知道它们出现的顺序,因此需要在任何顺序上都支持它们。这是比较容易的,但是在定义Data List Chunk之前需要先定义每个子Chunk。

    1、Label Chunk

首先来定义Label Chunk,这部分数据包含一个以空字符结尾的字符串,这个字符串可能是一个单独的填充字节。

 

更多详细内容请阅读DataModel章节、Block章节、String章节和Number章节。

我们能从Chunk中自动地获得填充字节。

2、Note Chunk

它和Label Chunk一模一样,我们只需要创建一个Label
Chunk的别名即可,如下所示:

 

更多详细内容请阅读DataModel章节和String章节。是的,就是这样,非常容易。

3、Labeled Text Chunk

它和Note Chunk、Label Chunk非常相似,不同的是它多了一些数字。复制一个Label Chunk的副本,并修改如下:

 

更多详细内容请阅读DataModel章节、Block章节、Number章节和String章节。

4、回到 Associated Data List
Chunk

我们把这些子Chunks组合进一个列表,如下图所示:

 

更多详细内容请阅读DataModel章节、Block章节、Number章节、String章节和Choice章节。

这里我们介绍一下Choice元素。它使每个Blocks找到到最佳匹配。你会发现列表的最后是Chunk。Wave文件规范表明这里可能会出现其他Block的字节。

(10)Sampler Chunk

Sampler Chunk和我们看到的其他Chunk比较相似,它包含一些数字和一些值构成的一个列表。定义如下:

 

更多详细内容请阅读DataModel章节、Block章节、Number章节和String章节。

(11)Instrument
Chunk

这是最后一个需要定义的Chunk,而且非常简单,由7个8比特数字组成。这个超级简单,定义如下:

 

更多详细内容请阅读DataModel章节、Block章节、Number章节和String章节。这部分的数字不是无符号的,它们取值的范围是负数到正数。

(12)完成Wav模型

到了结束这个模型的时候了。回到我们之前接触到的Wav Chunk,它的定义如下:

 

更多详细内容请阅读DataModel章节、Number章节和String章节。我们将添加一些Chunks,尽管不知道这些Chunks的顺序,这就用到了我们的朋友Choice元素。

 

更多详细内容请阅读DataModel章节、Block章节、Number章节、String章节和Choice章节。看吧,不是那么难。所有难的都工作结束了,但是在进行fuzzing之前我们还有许多事情要做。

3.3.3创建状态模型

现在我们已经创建了数据模型,接下来我们创建状态模型。对于文件fuzzing来说,状态模型非常简单,所有我们要做的就是写文件和启动目标进程。我们要做以下几个操作:

l  Output—-写文件。

l  Close—-关闭文件。

l  Call—–启动应用程序。

回到wav.xml文件,找到名字为TheState的StateModel。展开它,并包含以上3个操作(Action),如下所示:

 

更多详细内容请阅读StateModel章节、State章节、Action章节、DataModel章节、Data章节和Field章节。

3.3.4配置Publisher

在进行fuzzing之前,要做的最后一件事是配置Publisher。Publishers是Peach的I/O连接,它是实现输出、输入和调用等动作之间的管道。对于File fuzzing,我们将使用一个名字为File的Publisher。这个publisher允许写文件和通过call操作来启动一个进程。配置publisher比较简单,找到wav.xml文件的底部,它是Test元素的子元素。

 

现在,这个Publisher有一个名字为FileName的参数,它的值是被fuzzing文件的名字,这和在call操作中指定文件名字一样。现在,我们需要一种方式来探测目标什么时候崩溃和启动目标。同样地,也要收集一些相关信息便于以后查看,比如堆栈跟踪等。

3.3.5添加代理和监视器

(1)代理和监视器

现在,准备配置自己的代理和监视器。代理是特定的Peach进程,它可以在本地和远程运行,进程拥有一个或者多个监视器,这些监视器能够执行调试器加载和查看内存消耗等操作。本教程准备配置Microsoft Windbg来监视mplayer.exe的异常和其他常见信息。另外,我们也需要目标进程的Heap 调试可用。

(2)配置代理和监视器

首先,在样本文件中找到被注释的Agent元素,如下图所示:

 

取消注释,删除Location属性,这时Peach会自动的启动一个本地代理。我们要配置三个代理,分别对应windows、Linux和OSX三个操作系统。Windows代理有Windbg和PageHeap组成;Linux的代理由LinuxDebugger组成;OSX的代理由CrashWrangler组成。如下所示:

 

 

更多详细内容请阅读Agent章节、WindowsDebugger章节和PageHeap章节。

(3)配置Test元素

接下来,需要启用我们刚刚配置的代理。找到Test元素,取消该行的注释,并修改我们的Launcher
publisher,如下图所示:

 

更多详细内容请阅读Test章节。

(4)配置记录

现在,我们的监视器正在探测程序的各种错误,因此,还需要配置一个信息记录机制来捕获fuzzer运行的结果,在XML文件底部的Test标签中添加logger元素就可以实现该机制。如下图所示:

 

更多详细内容请阅读Test章节、Logger章节和File Logger章节。

(5)测试Fuzzer

现在让我们开始进行fuzzing。打开一个命令行窗口,运行命令如下:

 

如果你看到这个输出内容,说明所有步骤的配置正常。如果出现问题,回到前面出问题的部分,并尝试找出问题和解决它。

(6)运行Fuzzer

现在让我开始正真的fuzzer之旅。在命令行中,运行“peach
wav.xml”开始fuzzing。

3.3.6优化测试计数

当开始进行fuzzing的时候,还有一些事情可以优化,它的目的是减少模糊器产生迭代的次数。比如,所有真实的PCM/WAV样本和音乐数据可能是我们不需要fuzzing的东西了,这些所有的改变会产生不悦耳的声音。因此,让我们调低产生它们的变异器。

3.3.7并行运行

现在我们拥有了一个优化过的fuzzer,但是我们仍然需要fuzzing过程更快一些,恰好我们有一些进行fuzzing的额外机器。幸运地是Peach支持并行fuzzing,而且非常简单。我们要做的就是添加一个命令行参数,并且在每一个机器上运行。具体如下:

(1)配置机器

首先,需要配置每一台机器,每台机器上必须要有Peach程序、目标应用程序、wav.xml和sample.wav。

(2)运行Peach

现在,仅仅需要在每一台机器运行fuzzer即可。使用的语法如下:

机器1:c:\peach\peach.exe
-p3,1 wav.xml

机器2:c:\peach\peach.exe
-p3,2 wav.xml

机器3:c:\peach\peach.exe
-p3,3 wav.xml

请注意,我们在命令行中添加了带有两个数字的参数“-p”。第一个参数代表了要使用的机器的总数,第二个数字代表Peach运行在第几个机器上。非常简单。

4 方法论

本部分内容包含模糊测试的基本方法论。同时,也对fuzzer工具的开发步骤进行了介绍,网址如下:http://community.peachfuzzer.com/Development.html。

l  系统风险分析

u  确定信任边界

u  数据流(DFD)

u  代码年代

l  文件fuzzing

u  分析CRC’s、crypt等的格式

u  收集样本文件(大量的)

u  执行minset覆盖率分析(peach/tools/minset)

u  执行fuzzing

n  构建一个“dumb”fuzzing模板

n  根据需要进行智能模糊测试

n  用Microsoft SDL fuzzing的需求便于知道什么时候停止

l  网络fuzzing

u  分析CRC’s、crypto等的格式

u  收集样本用例

u  执行代码覆盖

n  确定接收fuzzing的代码区域

n  扩展用例进而提高代码覆盖率

u  执行fuzzing

n  构建一个“dumb”fuzzing模板

n  根据需要进行智能模糊测试

n  用Microsoft SDL fuzzing的需求便于知道什么时候停止

 

5 介绍

5.1 Peach介绍

Peach fuzzing框架被设计用来加速fuzzer的开发,它的服务对象为安全研究员、安全团队、顾问和公司。Peach通过分离数据模型和被fuzzing的状态系统以及fuzzing引擎来实现相关功能。同时,Peach还提供了一个健壮的代理/监视器系统来监视fuzzing的运行和探测

软件缺陷。Peach的所有主要组件都是可扩展和可插拔的,具有无限的灵活性。对于安全研究员来说,Peach提供了创建自定义fuzzing策略和数据模型的能力。这样的组合允许用户全面控制如何进行fuzzing。Peach有以下几个高级概念:

(1)Modeling—Peach通过提供数据模型和状态模型的fuzzing来实现操作。数据模型和状态模型是Peach的重点。对于普通的Peach用户来说,这是最花费时间的。模型中的细节水平区分了盲模糊测试和智能模糊测试。

(2)Publisher—它是I/O接口,描述了输入、输出和调用等抽象概念。正如在状态模型中看到的,它提供了真实的通道或实现。Peach包含有许多的Publisher,它提供了许多能力,比如写文件、通过TCP/UDP或者其他协议连接、构造web请求,甚至是调用com对象。创建自定义的Publisher是非常容易的。

(3)Fuzzing策略-–fuzzing策略是如何进行fuzzing的逻辑。比如,在同一时刻,我们要修改一个还是多个数据元素?我们使用哪个变异器?是不是要修改模型部分比其他部分多?是否要修改状态模型?Fuzzing策略唯一不能做的是产生真实的数据,这部分是由变异器实现的。Peach包含的一些fuzzing策略对于大部分使用者来说是非常重要的。

(4)变异器—变异器用于产生数据。它通过修改存在的默认数据值来产生新的数据。变异器常常包含一个简单的逻辑,进而完成一个简单的变异类型。比如,产生-50到50之间的数据,或者产生1到10000长度的字符串,或者产生0到32之间的500个随机数。

(5)代理—代理是特殊的peach进程,它能够在本地或者远程运行,拥有一个或者多个监视器或者远程Publisher。代理是Peach框架提供的具有健壮性的基础监视设备,它允许通过一个有许多层级的复杂系统来监视简单的fuzzing配置。一个Peach
fuzzer可拥有0个或者多个代理。

(6)监视器-–监视器运行在Peach代理进行中,它用来执行通用的任务,比如在fuzzing迭代中捕获网络流量、把调试器挂载到一个进程上来探测软件崩溃、网络服务崩溃或者停止时重启它。Peach包含许多监视器,添加新的监视器并编辑它是非常容易的。

(7)记录器—用来保存崩溃和fuzzing运行信息,Peach默认拥有一个文件系统记录器。

5.2 使用Peach进行Fuzzing

Peach提供了一个具有强大监视能力的引擎,然而还有一些工作是留给用户的。使用Peach进行fuzzing的主要步骤如下:

1、创建模型

2、选择/配置Publisher

3、配置代理/监视器

4、配置记录

6 训练

6.1 Peach 训练

Peach已经成长为一个复杂的套件,比如在一些安全会议上提供训练。同时,这个训练也提供给喜欢在网站上训练的公司,和让人员工参加会议训练相比,通常要节省不少成本。

6.2 会议训练

在以下安全会议上均提供有Peach 训练:Blackhat Vegas、CanSecwest、PacSec。对于不同的会议和国家来说,训练的价格是不一样的,具体的价格请查看各自的网站。

6.3 在线训练

Peach也提供了自定义内容的在线训练。更多信息请联系Michael
Eddington,邮箱地址为: mike@dejavusecurity.com

 

最小班人数

5个学生

最大班人数

20个学生

讲师数目

少于10学生1个讲师,多于10个学生2个讲师

能自定义内容吗?

可以,但需要额外费用

公司提供的必备设施有哪些?

训练场地、每个学生的训练机器、投影仪、白板等

6.4 训练大纲

整个训练课程注重以学生为中心,动手实践和实验室加强。第一天,学生能学习到Peach Fuzzing框架的使用方法,从实践者的角度,学习在面对多种目标时如何选取fuzzing方式,包括网络协议解析器、ActiveX/COM接口、文件解析器、API和web服务。学生将以真实的应用程序为目标进行构建和fuzzing学习。第二天,学生将以开发者的角度学习Peach的内部细节原理。为了方便配备必要的扩展技能和适应学生的自定义需求,Peach的架构和模块接口解释的非常详细。学生可以在实验室环境中编写自己的Peach插件进而加强相关概念。

完成该课程的学习,学生能够具备创建高效模糊器的能力,具体目标如下:

l  状态感知网络协议解析器。

l  多层架构应用程序

l  COM和Active/x组件

学生将具备在自己独一无二的环境中应用这些概念和工具的能力,进而运用并行fuzzing来提高fuzzing的效率。

(1)预备知识

l  有能力使用windows

l  有能力使用wireshark

l  XML或者HTML语言的基本知识

(2)笔记本电脑配置需求

l  能够运行两个windows虚拟机的笔记本电脑

l  双核CPU,内存大于2G

l  硬盘至少20G

l  以下虚拟平台之一

u  VMware Server2.0

u  VMware Player 2.0(免费版)

u  VMware Workstation 6.x

l  以下设备之一

u  USB2.0接口

u  双层DVD光驱

7 Peach 3

7.1 Peach Pits文件

Peach Pits是一些XML文件,包含Peach执行fuzzing所需的所有信息。当你使用Peach进行fuzzing时,需要创建一个Peach Pit文件,它主要包含以下几项内容:通用配置、数据模型、状态模型、代理和监控以及测试配置。也许你也想知道怎么调试pit文件和怎么验证pit文件是否有效(目前这两部分内容正在建设中)。

7.2 通用配置

Peach Pits文件的第一部分是通用配置。这里是包含其他Peach Pits文件的位置,比如外部引用接口、默认属性设置、python模块路径配置和自定义代码导入等。

7.2.1 Include

Include元素允许把其他pit文件包含到当前pit文件的名称空间中使用。当引用被包含的Pit文件时,用名称空间前缀和冒号的格式来命名。格式为:Foo:DataModel,如下所示:

 

属性

Ns—必须的。名称空间前缀。

Src—必须的。源码URL,用“file:”前缀来命名文件名。

7.2.2 Defaults

Defaults—用来设置Data元素的默认属性,比如字节顺序。(注:目前该元素的详细内容,官网打不开)。

7.2.3 PythonPath

PythonPath元素是一个顶层元素,它添加一个被python模块搜索的路径,主要作用是延伸Peach和包含自定义代码的位置。

 

属性:

Path—必须的。要添加的路径。

7.2.4 Import

Import元素允许在pit文件中导入自定义的python模块来使用。它就像python的关键字import一样。(注意,目前Peach 3不支持from属性)

 

属性

Import–必须的。和python的关键字import一样。

7.3数据模型

Peach Pit文件包含至少一个DataModel元素,也可以更多。DataModel描述的数据包括类型信息、关系信息(大小、数目、偏移)和其他让模糊器执行智能变异的信息。DataModel能被其他的DataModel重用和引用,允许将复杂的定义分解为可读部分。

7.3.1 DataModel

DataModel是Peach根元素的子元素之一,它通过添加子元素(比如Number、Blob或者String)的方式定义了数据块的结构。

(1)属性

Name—必须的。当引用模型或者调试时,友好的DataModel名字是非常有用的。

Ref—可选的。引用一个DataModel模板。

Mutable—可选的,默认为真。该元素是否可变异。

Constraint—可选的。确定一个表达式,它帮助Peach确定数据元素是否已被适当的消耗。

(2)子元素

Block、Choice、Custom、Flag、Flags、Number、Padding、String、XmlAttribute、XmlElement、Relation、Fixup、Transformer、Placement。

(3)例子

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

 

 

一个DataModel可以引用其他DataModel,可以继承带有ref属性的子元素。如下所示:

 

(4)引用(ref属性)

当一个引用(ref属性)被提供时,被引用DataModel元素的内容将被复制,并已次为基础来创建新的DataModel元素。新DataModel的任何子元素将覆盖具有相同名字的基础元素。在这个例子中,自定义的子模块中包含一个名字为Key的字符串,它的值将会覆盖没有值的父字符串“Key”,如下所示:

 

 

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

 

7.3.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中,任何类型或长度的数据能破解。

 

包含有默认值的Blob:

 

7.3.3 Block

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可以根据需要多层的嵌套,它可以帮助创建逻辑结构而不改变数据包含的内容。

 

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

命名一个Block。给Block取一个友好的名字使他们容易理解和调试。

 

 

引用一个Block。引用的内容将被复制,并作为基础来创建新的Block。新Block中的任何子元素将覆盖那些已经存在的具有相同名字的元素。

 

名字为“MyName”的Block将覆盖被引用的“OtherDataModel”。当被解析时,它的数据结构如下所示:

 

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

 

使用该模板作为一个引用

 

输出为:

 

 

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

 

7.3.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。

 

7.3.5 Custom

该元素的相关内容正在建设中。

7.3.6 Flag

Flag元素在Flags容器中定义了一个特定的位区域。

 

(1)属性

Name—可选的。元素的名字。

Size—必须的。大小,以位为单位为

Position—必须的。Flag的开始位置(以0位基础)。

Value—带有Blob的默认值。

valueType—格式的默认值(hex,string,literal)。

Mutable—可选的。数据元素是否变异,默认为真(peach 2.3)。

(2)子元素

Relation。

7.3.7 Flags

Flags定义了一组Flag的大小。

 

(1)属性

Name—可选的。元素的名字。

Size—必须的。大小,以位为单位。

Mutable—可选的。元素是否可以变异,默认为真。

(2)子元素

Fixup、Flag、Placement、Relation、Transformer。

7.3.8 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)例子

一个简单的Number例子,它将产生一个32位(4字节)Number,默认值为5。

 

为了只使用16位(2字节),改变size的值为16.

 

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

 

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

 

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

 

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

 

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

 

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

7.3.9 Padding

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

(1)属性

Name—必须的。Number元素的名字。

Aligned—将父元素对齐到8字节边界,默认为假。

Alignment—对齐到这个位边界,比如(8、16等),默认为8。

alignedTo—基于我们要填充的元素名字。

Lengthcalc—计算结果为整数的脚本表达式。

Constraint—一个以Python表达式形式的约束。用于数据破解。

Mutable—元素是否可变异,默认为真,有效选项为真和假。

(2)有效子元素

Fixup、Relation、Transformer、Hint。

(3)例子

 

7.3.10 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元素被自动添加。

 

7.3.11 XmlAttribute

该元素定义了XML元素的属性。只有当父元素是XmlElement时,才有效。

 

(1)属性

Name—可选的。数据模型的名字。

Minoccurs—可选的。这个块必须发生变化的最小次数。

Maxoccurs—可选的。这个块会发生变化的最大次数。

isStatic—可选的。当解析的时候,该元素被视为一个令牌,默认为假。

Token—可选的。当解析的时候,该元素被视为一个令牌,默认为假(Peach 2.3)。

Mutable—可选的。该元素是否可变异,默认为真(Peach 2.3)。

attributeName—必须的。XML元素的名字。

Ns—可选的。XML名称空间。

(2)有效子元素

Block、Choice、String、Number、Blob、Flags、Fixup、Hint。

7.3.12 XmlElement

定义一个XML元素,XML文档的基本块构建。这用来fuzzing一个XML文档的内容,但是不包含XML解析器。XmlElement和XmlAttribute产生的所有输出都将被格式化。请注意,XmlElement和XmlAttribute元素不支持数据破解。如果需要破解Xmlelement和XmlAttribute中的XML,请用挂载到一个String元素的XmlAnalyzer。

 

(1)属性

Name—可选的。数据模型的名字。

Minoccurs—可选的。这个块必须发生变化的最小次数。

Maxoccurs—可选的。这个块会发生变化的最大次数。

isStatic—可选的。当解析的时候,该元素被视为一个令牌,默认为假。

Token—可选的。当解析的时候,该元素被视为一个令牌,默认为假(Peach 2.3)。

Mutable—可选的。该元素是否可变异,默认为真(Peach 2.3)。

attributeName—必须的。XML元素的名字。

Ns—可选的。XML名称空间。

(2)有效子元素

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

7.3.13 Hint

Hint是变异器的扩展。它能附加到数据元素上,为Peach引擎提供更多关于被解析数据的信息。例如,当字符串包含一个数字时,只有包含在字符串mutator中的数字测试才会执行。如果你添加一个NumericalString提示到String,它将附加所有的数字变异器。

 

可用的Hints

NumericalString、ArrayVarianceMutator-N、DWORDSliderMutator、BitFlipperMutator-N、

NumericalVarianceMutator-N、Telecommunications-N、FiniteRandomNumbersMutator-N、SizedVaranceMutator-N、SizedNumericalEdgeCasesMutator-N、SizedDataVaranceMutator-N、SizedDataNumericalEdgeCasesMutator-N、type、ValidValues。

7.3.14 Relation

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

(1)大小关系

在这个例子中,Number元素的值将确定名字为TheValue的string元素的大小。请注意,这也适用于多字节字符,如wchar。在Peach未来的版本中,这将会改变,或者将包括新的类型长度关系,以便更好地支持UTF-8和其他Unicode编码。

 

在这个例子中,我们将提供两个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)偏移关系

偏移关系是Peach最新增加的,它允许需修改格式,这些格式需要偏移的改变和输出变量元素的偏移。这里有一些元素,它们是各种String元素偏移量的ascii表示。

 

1、相对偏移量:

从Peach 2.3开始支持相对偏移的概念。 相对偏移来自附加到relation的数据元素。 请考虑以下示例。,当确定StringData的偏移量时,Peach将根据需要,对OffsetToString的位置进行加上/减去它的值,以确定正确的偏移量。

 

2、相对于偏移量:

Peach还支持相对于另一个元素的偏移。它用于以下情况,一个元素包含另外一个元素的偏移,而被包含的偏移的元素是一个结构体的开头。
以下示例中,StringData偏移量将通过添加OffsetToString的值到Structure位置的方式来计算。

 

包含expressionGet / expressionSet

当使用带有偏移关系的expressionGet / Set时,将提供两个变量:self和offset。 Self引用了一个父元素的引用,offset是一个整数。

包含Placement的偏移关系

这个模型中,将使用一个典型的模式。在这个模式中,一个偏移列表会给我们另一个元素的位置。
使用Placement元素将创建的Data字符串移动到Chunks块之后。

 

7.3.15 Fixup

Fixup是一些代码函数,它通常操作另一个元素数据来产生一个值。校验和算法就是这样一个示例。Peach默认包含有以下fixups。

l  Utility Fixups

CopyValueFixup

SequenceIncrementFixup

SequenceRandomFixup

l  Check-sum Fixups

Crc32DualFixup

Crc32Fixup

EthernetChecksumFixup

ExpressionFixup

IcmpChecksumFixup

LRCFixup

l  Hashing Fixups

MD5Fixup

SHA1Fixup

SHA224Fixup

SHA256Fixup

SHA384Fixup

SHA512Fixup

7.3.16 Transformers

Transformers在父元素上执行静态转换或编码。通常来说Transformers是两个方向:编码和解码,但也不全是。 比如ZIP压缩,Base64编码,HTML编码等。与Fixups不同,Transformers对父元素操作,而Fixups引用另一个元素的数据。

 

上述数据模型的输出为0x01
<len(b64(Data))> <b64(Data)>

Peach 3中的默认Transformers

 

 

l  Compression

Bz2CompressTransformer

Bz2DecompressTransformer

GzipCompressTransformer

GzipDecompressTransformer

l  Crypto

Aes128Transformer

ApacheMd5CryptTransformer

CryptTransformer

CvsScrambleTransformer

HMACTransformer

MD5Transformer

SHA1Transformer

TripleDesTransformer

UnixMd5CryptToolTransformer

UnixMd5CryptTransformer

l  Encode

Base64EncodeTransformer

Base64DecodeTransformer

HexTransformer

HexStringTransformer

HtmlEncodeTransformer

HtmlDecodeTransformer

HtmlEncodeAgressiveTransformer

Ipv4StringToOctetTransformer

Ipv4StringToNetworkOctetTransformer

Ipv6StringToOctetTransformer

JsEncodeTransformer

NetBiosEncodeTransformer

NetBiosDecodeTransformer

SidStringToBytesTransformer

UrlEncodeTransformer

UrlEncodePlusTransformer

Utf8Transformer

Utf16Transformer

Utf16LeTransformer

Utf16BeTransformer

WideCharTransformer

l  Type

AsInt8Transformer

AsInt16Transformer

AsInt24Transformer

AsInt32Transformer

AsInt64Transformer

IntToHexTransformer

NumberToStringTransformer

StringToFloatTransformer

StringToIntTransformer

l  Misc

EvalTransformer

7.3.17 Placement

Placement元素告诉数据破解者,在输入流被解析之后,特定元素应该被移动。结合偏移关系是Peach支持的文件处理方式,它通过偏移来包含元素的引用。

 

属性:

以下其中之一是必须的:

After—元素移动到之后。

Before—元素移动到之前。

7.4状态模型

Peach中有两个创建fuzzer的模型,DataModel和StateModel。StateModel重新创建测试一个协议所必须的基本状态机器逻辑。它定义了怎么给目标发送和接收数据。StateModel的范围从非常简单到及其复杂。建议在开始时,保持状态模型简单,需要时再进行扩展。

7.4.1 state

state封装了一个为Peach工作的逻辑单元,进而来执行一个大的状态模型。
一些状态模型仅需要一个状态,而另外一些状态则需要许多状态来创建复杂协议模型。state由action组成。 每个action可以执行与单个状态如何封装逻辑相关的任务。

属性:

Name—必须的。State的名字。

有效子元素:Action。

7.4.2 Action

Action元素能在StateModel中执行多种操作。Action是发送命令给Publisher的一种主要方式,它能发送输出,接收输入或打开一个连接。Action也能在StateModel中改为其他状态,在DataModel之间移动数据,调用被代理定义的方法。它是state元素的子元素。

 

(1)属性

Name—可选的。action的名字。

Type—必须的。action类型。

When—只有在提供的表达式求值为true时才执行操作。

onComplete—表达式在完成操作后运行。

onStart—表达式在开始操作时运行。

Method—必须的。类型为call。用来调用的方法。

Property—必须的。类型为setproperty或getproperty。获取或者设置属性。

Setxpath—必须的。类型为slurp,设置Xpath的值。

Value—值。类型为slurp。

valueXpath—Xpath的值。类型为slurp。

Ref—更改为状态的引用。类型为changestate。

(2)有效子元素

DataModel、Data、Param。

(3)Action类型:

1、start(隐式)

启动Publisher,这是一个隐式的动作,一般不需要。

 

2、stop(隐式)

停止Publisher,这是一个隐式的动作,一般不需要。

 

    3、Open/connect(隐式的)

Open和connect是彼此的别名,执行相同的操作,这个动作也是隐式的,对于文件来说,文件必须被打开或者创建。对于sockets来说,应该打开一个连接。只有当需要特殊控制的时候,才使用这个操作。

 

 

4、Close(隐式的)

Close同样也是隐式的,一般不使用,除非需要特殊控制时使用。

 

5、Accept

接收一个连接。并不是所有的Publisher都支持这个操作类型。这个操作通常会堵塞直到一个连接来到时可用。

 

    6、Input

从Publisher中接收或者读取输入。需要一个指定DataModel来破解和包含到来的数据。

    7、Output

通过Publisher发送或写output操作。需要一个DataModel,可随意地提供一个的Data设置。

 

    8、Call

调用一个被Publisher定义的方法,这个Publisher含有可选参数。并不是所有的Publisher都支持。

 

    9、Setproperty

设置一个属性。并不是所有的Publisher都支持。

 

   
10、Getproperty

获取一个属性。并不是所有的Publisher都支持。

 

   
11、Slurp

Slurp用于在两个DataModel之间移动数据。这些DataModel被分配给一个StateModel中的不同action。一个标准的用例是在一个协议序列中。一个序列ID或者一个怀疑ID需要被发送回服务器。Slurp将从一个action复制数据到另外一个action。从一个服务器输入,输出到另外一个服务器。

 

   
12、Changestate

改变一个不同的状态。它被经常用于带有when属性的结合中。

 

   
13、When

执行一个基于表达式的action。当表达式计算值为真时,action被执行。

 

7.4.3 状态模型例子

  
(1)文件fuzzing

当进行文件fuzzing的时候,Peach把数据写进一个文件,然后调用目标进程打开上述的文件。对于一个简单的文件模糊器,Peach会用一个单独的state和三个action。

 

  
(2)简单网络状态模型:

    在这个状态模型中,Peach将会发生和接收来自一个TCP端口的一系列包。

 

7.5 代理

代理是特殊的Peach进程,它可以在本地或者远程运行。这些进程拥有一个或者多个监视器,这些监视器可以执行加载调试器,查看内存消耗或者探测错误等操作。代理中的监视器可以收集信息和代表fuzzer执行操作。通用的代理有:本地代理、TCP远程代理、ZeroMQ、REST Json代理。

(1)本地代理

Peach运行时支持一个运行在进程中的本地代理。如果不指定的话,这是一个默认的代理类型。配置一个远程代理如下:

 

(2)TCP远程代理

这个代理存活在本地或远程机器的一个单独的进程中,通过TCP远程完成连接,是一种被本地运行时支持的RPC形式。为了使用远程代理,代理进程必须首先运行起来。

 

(3)ZeroMQ代理

这个代理存活在本地或者远程机器的一个独立进程中。使用ZeroMQ完成连接。ZeroMQ支持许多类型的语言。可以使用这个代理信道来执行一个非.net代理(比如Python或者ruby)。为了使用一个远程代理,代理进程必须首先运行起来。

 

(4)REST Json 代理

这个代理被用来与用其他语言编写的自定义的远程代理进行通信。

 

 

 

 

 

 

 

7.6 监视器

主要有以下几种监视器:windows监视器、OSX监视器、Linux监视器和跨平台监视器。

7.6.1 windows监视器

  
(1)Windows Debugger Monitor

WindowsDebugger监视器控制了一个windows调试句柄。主要有以下用途:进程调试、服务调试、内核调试。

必须参数:

l  Commandline—用逗号分隔的窗口名字。

l  Processname—当找到一个窗口的时候,触发错误,默认为假。

l  Kernelconnectionstring—内核调试的连接字符串。

l  Service—要挂载的windows服务名称。如果停止或者崩溃,服务将会被启动。

可选参数

l  Symbolspath—符号表路径或者服务。默认为:“SRV*http://msdl.microsoft.com/download/symbols”

l  Windbgpath—windbg的安装路径。尽量在本地。

l  Noncrystalline—直到从状态模型的匹配调用完成时,debugger才会被挂载。

l  Ignorefirstchanceguardpage—忽略第一个机会机会保护页面错误。这些有时是假阳性或反调试错误。默认为假。

l  Ignoresecondchanceguardpage—忽略第二个机会保护页面错误。这些有时是假阳性或反调试错误。默认为假。

l  Nocpukill—不要使用进程CPU使用率提前终止。默认为假。

l  Faultonearlyexit—如果进程存在,触发错误。默认为假。

l  Waitforexitoncall–如果时间间隔到了,-等待状态模型调用的进程退出和参数故障。

l  Waitforexittimeout—等待退出,timeout值单位为微秒。(-1位无穷大)默认位10000。

l  Restaroneachtest—为每次迭代重启进程。默认为假。

 

 

   
(2)cleanup registry monitor

cleanup registry监视器将移除一个注册表键或者它的子健。以下前缀键被用到:

l  HKCU\—当前用户。

l  HKCC\—当前配置。

l  HKLM\—本地机器。

l  HKPD\—性能数据。

l  HKU\—用户。

参数:

Key—要移除的注册表键。

Childrenonly—仅有的清除子健。默认为假。

 

   
(3)pageheap 监视器(windows系统)

Pageheap监视器将使pageheap调试选项对可执行程序可用。

参数:

Executable—可执行程序名字。(没有路径)。

Windbgpath—windbg安装路径。尽量在本地。

 

(3)PopupWatcher 监视器(windows

Popupwatcher监视器能根据标题关闭窗口。

参数:

WindowNames—被逗号分隔的窗口名字。

Fault—当找到窗口时,触发错误。默认为假。

 

   
(4)windowsService 监视器。

WindowsService监视器控制一个windows服务。

参数:

Service—系统服务的名字,也可以是服务显示的名字。

MachineName—服务存在的机器,可选,默认为本地机器。

FaultOnEarlyexit—如果服务提前存在,则为故障。

Restart—windows 服务要挂载的名字,如果停止或者崩溃,服务将重启。

StartTimeout—服务要挂载的名字,如果停止或者崩溃,服务将重启。

 

7.6.2 OSX监视器

   
(1)CrashWrangler 监视器

CrashWangler监视器将启动一个进程和监视器感兴趣的崩溃。这个监视器采用苹果系统自带的CrashWrangler工具,这个工具能从开发者网站下载。为了该工具能够正常运行,它必须在每个机器上进行编译。

参数:

Command—要执行的命令。

Arguments—命令行参数,可选,默认没有。

StartOnCall—状态模型调用的启动命令。可选,默认没有。

UseDebugMalloc—使用OSX Debug
Malloc(比较慢),可选默认为假。

ExecHandler—Crash Wrangler 执行处理程序,可选,默认为exc_handler。

ExploitableReads—读a / v被认为是可利用的?可选,默认为假。

NoCpuKill—通过CPU使用禁用进程杀死。可选,默认为假。

CwLogFile—CrashWrangler记录文件。可选,默认为cw.log。

CwLockFile—CrashWrangler锁文件,可选,默认为cw.lock。

CwPidFile—CrashWrangler PID文件,可选,默认为cw.pid。

 

(2)CrashReporter
Monitor
(OSX

CrashReporter监视器将报告被OSX系统探测到的Crash报告。

参数:

ProcessName—需要监视的进程名字。可选,默认为所有。

 

7.6.3 Linux监视器

LinuxCrash监视器用一个脚本来捕捉错误进程,该脚本被内置在内核中。

参数:

Executable—目标可执行程序,被用于过滤崩溃,可选的,默认为所有。

LogFolder—记录文件的文件夹。可选默认为“/var/peachcrash”。

Mono—mono执行=程序所需的运行时的全路径。可选,默认为“/usr/bin/mono”。

 

7.6.4 跨平台监视器

   
(1)canakit relay 监视器

它控制一组能够打开/关闭AC和DC线路的继电器。这对于在模糊运行期间打开和关闭设备非常方便。 任何带有交流或直流电源线的设备都可以通过接线来控制。

参数:

Serialport—电路板上的串行端口。

RelayNumber—延迟触发。

ResetEveryIteration–在每次迭代时重启动电源,可选,默认为假。

OnOffPause—在开/关之间暂停,以微秒为单位,可选,默认为0.5秒。

ResetOnStart—在启动时,重置设备,可选,默认为假。

ReverseSwitch—当NC端口被用于电源时,切换命令的顺序。

 

   (2)Cleanup Folder监视器

Cleanup Folder监视器在每次迭代时将会移除文件夹的内容,这用于清理后的目标。

参数:

Folder—要清理的文件夹

 

   (3)IpPower9258监视器

IpPower9258监视器控制找一个联网的能量切换,它允许设备在fuzzing时被被关闭或者开启。这个模型是“IP
Power 9258”,特别是在购买eaby和亚马逊时有用。

参数:

Host—主机或者IP地址(能包含http接口端口,比如8080)。

User—用户名。

Password—密码。

Port—重写设置的端口。

ResetEveryIteration—每次迭代时重启电源,可选,默认为假。

powerOnoffpause—在电源打开和关闭时暂停,以微秒为单位,可选,默认为0.5秒。

 

   (4)内存监视器

内存监视器检查一个进程的内存使用情况,当它达到设置极限时抛出一个错误,在探测无关的内存使用情况式非常有用。

参数:

Pid—监控的进程ID。

Processname–监控的进程名字。

memoryLimit—发生错误时,内存的使用极限,可选,默认为0MB。

Stoponfault—如果触发了一个错误,停止fuzzing,可选的,默认为假。

 

   (5)Pcap监视器

Pcap监视器在迭代时有一个网络捕获器,被捕获的数据是废弃的,在每次迭代时重写捕获。如果发生错误,被捕获的数据被记录为一个pcap文件,pcap文件wireshark和tcpdump兼容。

参数:

Device—捕获的设备名字。

Filter—pcap类型过滤器,可选。

 

   (6)Ping监视器

Ping监视器将阻塞,直到超时是打击。此监视器对于验证目标是否仍然正常并等待目标重新启动非常有用。

参数:

Host—主机或者IP地址。

Timeout—时间间隔,微秒为单位,可选,默认为1000。

Data—ping包中药发生的数据,可选。

Faultonsuccess—如果ping成功了,出现错误,可选,默认为假。

 

(7)进程监视器

进程监视器在fuzzing时控制了一个进程,它由许多特性:

l  当进程死掉时,重启一个进程。

l  如果一个进程已经退出了,记录一个错误。

l  每次迭代时,重启一个进程。

l  终止一个cpu使用率很低的进程。

l  和StateModel相互影响,允许等待进程退出。

l  和StateModel相互影响,允许延迟开始一个进程。

参数:

Executable—要激活的可执行程序。

Arguments—命令行参数,可选。

Restartoneachtest—每次迭代时重启进程,可选,默认为假。

Faultonearlyexit—如果进程退出,触发错误,可选,默认为假。

Nocpukill—当cpu使用率接近0时,禁用进程杀死,可选,默认为假。

Startoncall—当从StateModel中调用一个动作时,开始进程。这个值和方法值必须匹配,可选。

Waitforexitoncall—在状态模型调用时,等待进程退出。这个值和方法值必须匹配,可选。

Waitforexittimeout—等待超时值。当超时时,触发错误,可选,默认禁用。

 

(8)Processkiller 监视器

在每次迭代后,Processkiller监视器将会杀死(终结)指定进程。

参数:

Processnames—要杀死的进程名字,逗号分隔。

 

(9)保存文件监视器

当错误发生时,保存文件监视器将会保存一个指定的文件作为记录数据的一部分。

参数:

Filename—保存到记录数据的 文件。

 

(10)socket 监视器

Socket监视器等待一个TCP或者UDP的连接。如果连接被接受了,错误被触发。

参数:

Host—远程主机的IP地址,可选默认为空。

Interface—监听的IP地址接口,可选,默认为0.0.0.0。

Port—监听端口,可选,默认为8080。

Protocol—要监听的协议类型,可选,默认为tcp。

Timeout—等待连接的时长,可选,默认为1000ms。

Faultonsuccess—如果没有连接被记录,发生错误,可选,默认为假。

 

(11)ssh监视器

Ssh监视器通过ssh连接一个远程主机。监视器支持密码、键盘和私有密钥身份验证方法。监视器在一个远程系统上运行一个给定的命令。如果发生错误,一个正则表达式能被提供给命令结果来确定。监视器在模糊运行过程中保持对系统开放的持久连接。

参数:

Host—ssh连接的主机。

Usename—ssh用户名。

Command—检查错误的命令。

Password—ssh账户的密码,可选,默认为空。

Keypath—ssh key的路径,可选默认为空。

checkValue—正则表达式匹配命令响应,可选,默认为空。

Faultonmatch—如果正则表达式匹配,触发错误,可选,默认为真。

 

(12)ssh下载器监视器

Ssh下载器监视器可以通过ssh sftp 从远程主机上下载一个文件或者文件夹。这个监控器支持密码、键盘、私有秘钥认证方法,有能力删除它下载的文件。

参数:

Host—ssh主机。

Username—ssh用户名

Password—ssh账户密码,可选,默认为空。

Keypath—ssh key路径,可选,默认为空。

File—要下载的文件,可选,默认为空。

Folder—下载的文件夹,可选,默认为空。

Remove—下载后,移除远程文件,可选,默认为真。

 

(13)vmware 监视器

Vmware监视器能控制一个wmware虚拟机。监视器能启动一个虚拟机,在每次迭代时重新设置一个快照。当一个错误发生时,它会重新设置一个指定的快照。

参数:

Vmx—虚拟机路径

Host—主机名字,可选。

Login—远程主机上认证用户名。可选。

Pasword—远程主机上的认证密码,可选。

Hosttype—远程主机类型,可选,默认为“default”。

Hostport—远程主机上的TCP/IP端口,可选。

Default—default。

VIserver—vCenter Server,ESX/ESXi 主机,VMWare Server
2.0。

Workstation—VMWare Workstation

WorkstationShared—VMWare Workstation(shared 模式)。

Player—VMWare player。

Server—VMWare Server 1.0.x。

snapshotIndex—VM snapshot 索引,可选。

Snapshotname—VM snapshot名字,可选。

ResetEveryIteration—每次迭代时,重新设置VM快照,可选,默认为假。

ResetonfaultBeforecollection—在数据收集期间,当探测到一个错误之后,重新设置VM。

Waitfortoolsinguest—等待工具在客户机中启动,可选,默认为真。

Waittimeout—等待客户机工具多少秒,可选,默认为600。

 

7.7 测试

Test元素被用于配置一个指定的fuzzing测试,这个配置通过一个Publisher和其他选项(比如including/excluding等被变异的元素、Agents、fuzzing策略)组合成一个StateModel。多个test元素是支持的,在Peach命令行使用中,只需简单提供test元素的名字即可。

 

属性:

Name—必备的,test元素的名字,默认为“Default”。

Waittime—每次测试之间的等待时间,默认为0。

Faultwaittime—在开始下一次迭代时等待错误的时间,默认为0。

controlIneration—我们只需控制迭代的频率,默认为0。

有效子元素:

Agent(可选)

StateModel(必须)

Publisher(必须)

Include(可选)

Exclude(可选)

Strategy(可选)

Logger(可选,推荐)

7.8 Publishers

Publishers是Peach发送和接收数据的I/O接口,Publisher支持基于流和操作的调用。当fuzzer运行时,除了slurp之外,所有的action使用一个Publisher来执行操作。不同的Publishers支持不同的action类型。比如,文件Publisher支持从一个文件读取数据作为输入,把数据写入一个文件作为输出,但是不支持接收或者调用。这和com Publisher不同,它支持调用,但不支持输入、输出或接收。所有的fuzzing定义必须使用至少一个Publisher,如果需要的话也可以选择多个Publishers。当使用多个Publisher的时候,每个action必须指定它引用了哪个Publisher,通请参考action的publisher属性中的name属性。如果Publisher属性丢失了,action将执行Test中定义的第一个Publisher。

7.8.1 网络Publishers

当进行网络协议fuzzing的时候,Publisher常常被用于包含目标协议的协议。比如,当进行http协议fuzzing的时候,使用Tcp Publisher。当进行TCPfuzzing的时候,使用IPv4或IPv6 Publisher。当进行IPv4 fuzzing的时候,使用ethernet
Publisher。

7.8.2 自定义Publishers

Peach支持创建自定义Publisher。建议先对一些现有Publisher代码进行审核,以了解Publisher怎么运行。创建一个自定义的Publisher不需要改变Peach的源代码。相反,代码放被一个新的.NET程序集(dll)中,然后把dll添加进Peach bin 文件夹中,Peach会自动地识别新的Publisher,并使它可用。

7.8.3 Publishers

(1)Com

Com Publisher允许调用方法和com对象上的属性。

参数:clsid—com clsid。

操作:Call—调用一个方法。Getproperty—获取属性值。Setproperty—设置属性值。

 

(2)Console

Console Publisher将会输出数据到标准输出。

参数:没有。操作:Output—需要显示的数据。

 

(3)consoleHex

consoleHex Publisher 将会输出数据到一个标准输出。数据将会以十六进制格式显示。

参数:Bytesperline—每行文本字节数,可选,默认为16。操作:Output—要示的数据。

 

(4)File

File Publisher将会打开一个文件来读和写。

参数

Filename—要打开文件的名字。

Overwrite—覆盖存在的文件,可选,默认为真。

Append—向存在的文件附加数据,可选默认为假。

操作

Output—数据被写进一个文件。

Input—从文件读取数据。

 

(5)FilePerIteration

FilePerIteration Publisher在每次迭代fuzzer执行时,将会创建一个输出文件。当进行预先产生fuzzing事件时,非常有用。

参数

Filename—创建文件的名字,文件名字必须包含“{0}”,它将被迭代次数代替。

操作

Output—写数据到文件。

 

(6)Http

Http Publisher通过你选择的方法发送HTTP数据。这个Publisher支持以下特性:

l  通过Basic、Digest或者windows集成来认证。

l  定义方法类型。

l  Fuzzing和动态头设置(键和值)。

l  Fuzzing和动态查询字符串设置。

l  可选的cookie支持。

l  SSL

参数

Method—HTTP 方法类型(Get,Post等)。

Url—目标url。

Baseurl—一些认证类型使用的基本url,可选。

Username—认证用户名,可选。

Domain—认证域名,可选。

Cookies—可用的cookie支持,可选,默认为真。

Cookiesacrossiterations—跨迭代跟踪cookies,可选,默认为假。

Timeout—等待多久数据连接,单位为微秒,可选,默认为3000。

Ignorecerterrors—忽略cert状态,允许http,默认为假。

操作

Call—为了fuzzing查询字符串或者头,支持指定的方法名。

Query—为一次调用操作指定方法名字,第一个参数为查询字符串。

Header—为一次调用操作指定方法名字,第一个参数是头名字,第二个是值。

Output—通过output发送数据,通过输出发送的数据作为HTTP主体提供。

 

 

 

(7)NULL

所有发送到null Publisher的数据将被丢弃,这个Publisher被单元测试使用。

参数:没有。

 

(8)RawEther

RawEther Publisher允许发送带有IP头的raw IPv6包。

参数

Interface—要绑定的接口IP,可选。

Protocol—要使用的Ethernet协议,可选,默认为ETH_P_ALL。

Timeout—数据/连接等待的时间,单位为微秒,可选,默认为3000。

操作

Output—发送数据给远程主机。

Input—从远程主机接收数据。

 

(9)RawIPv4

RawIPv4 Publisher允许发送带有IP头的Raw IPv4包。

参数

Host—主机名或者远程主机IP地址。

Interface—要绑定的接口IP地址。

Protocol—要使用的IP协议。

Timeout—数据/连接要等待的时间,单位为微秒,可选,默认为3000。

maxMTu—最大允许可用的MTU属性值,可选,默认为131070。

minMTU—最小允许可用的属性值,可选,默认为1280。

操作

Output—发生数据给远程主机。

Input–从远程主机接收数据。

 

(10RawIPv6

官网内容不可访问。

(11)Rawv4

Rawv4 Publisher允许发送带有IP头的Raw IPv4包。

参数

Host—主机名或者远程主机IP地址。

Interface—要绑定的接口IP地址。

Protocol—要使用的IP协议。

Timeout—数据/连接要等待的时间,单位为微秒,可选,默认为3000。

maxMTu—最大允许可用的MTU属性值,可选,默认为131070。

minMTU—最小允许可用的属性值,可选,默认为1280。

操作

Output—发生数据给远程主机。

Input–从远程主机接收数据。

 

(12)RawV6

RawV6 Publisher允许发送带有IP头的IPv6包。

参数

Host—主机名或者远程主机IP地址。

Interface—要绑定的接口IP地址。

Protocol—要使用的IP协议。

Timeout—数据/连接要等待的时间,单位为微秒,可选,默认为3000。

maxMTu—最大允许可用的MTU属性值,可选,默认为131070。

minMTU—最小允许可用的属性值,可选,默认为1280。

操作

Output—发生数据给远程主机。

Input–从远程主机接收数据。

 

(13)Remote

Remote Publisher 从一个Peach Agent进程中运行另外一个Publisher。

参数

Agent—运行Publisher的代理名字。

Class—运行的Publisher名字。

Other parameters—远程Publisher所需的参数。

操作

被远程Publisher支持的任何操作。

 

(14)TCPClient
Publisher

TCPClient Publisher连接一个远程的TCP服务。

参数

Host—主机名或者远程主机IP地址。

Port—目的端口数字。

Timeout–数据的等待时间,单位为微秒,可选,默认为3000。

Connecttimeout—一个新连接的等待时间,单位为微秒,可选,默认为10000。

操作

output—发送数据到远程主机。

Input—从远程主机接收数据。

 

(15)udp Publisher

Udp Publisher 能发送和接收UDP包。

参数

Host—主机或者ip地址或者远程主机。

Port—目的端口数字,当第一个包被目标发送时可选。

Srcport—源端口,可选。

Interface—绑定的接口IP

Timeout—数据/连接的等待时间,单位为微秒,可选,默认为3000。

maxMTU—最大允许可用MTU属性值,可选,默认为131070

minMTU—最小允许可用MTU属性值,可选,默认为1280。

操作

Output—发送数据到远程服务器。

Input—从远程主机接收数据。

 

(16)webservice
Publisher

Webservice Publisher能调用基于web服务的SOAP和WCF。默认情况下,Publisher将会尝试定位一个服务定义或者,被提供的服务定义。

参数

Url—webService URL

Service—服务名字。

Wsdl—web服务的WSDL路径或url,可选。

Erroronstatuscode—当状态代码不是200时,发生错误,可选,默认为真。

Timeout—数据/连接的等待时间,单位为微秒,可选,默认为3000。

Throttle—连接之间的等待时间,单位为微秒,可选,默认为0。

操作

Call—web服务要调用的方法属性。

 

7.9 Loggers

Peach有一个可扩展的记录系统,它允许使用者存储他们想要的记录。默认情况下,Peach使用一个单独的文件系统记录器。

文件系统记录器会指定一个路径,它会创建一个包含运行名字和时间标记的文件夹,文件夹中是真实的记录。除非探测到错误,否则非常少的记录信息会被保存在磁盘空间中。

 

参数:

Path—创建记录文件的相对或绝对路径。

7.10 变异策略

一般来说,Peach的Datamodel是在自上而下的。它保证每个数据元素都都能fuzzing到各种事例,但对于能够产生大量事例的大的复制系统来说不是最优的。此外,需要一种能能容易改变如何执行fuzzing的机制,进而以最优的方法和策略来进行研究。这就需要变异策略。通过实现单个类,用户可以完全控制Peach如何fuzzing包括状态转换的目标。

7.10.1 随机

随机策略会一直运行,此策略将一次选择最多MaxFieldsToMutate个元素进行变异。对于每个选择的元素,其相应的突变体之一是随机选择的。
桃源从随机生成的种子数中导出这些选择的随机性。可以通过将相同的种子值作为Peach命令行选项与–seed命令行选项传递来重复相同的测试运行。这对于重放模糊迭代以重现先前的故障很有用。

参数

MaxFieldsToMutate—一次变异的最大区域,默认为6。

Switchcout—进行切换数据集之前执行的迭代次数,默认为200。

 

7.10.2 有顺序的

在同一时刻,Peach 将会按照顺序对DataModel中的每个元素进行fuzzing。Peach将从Datamodel的顶部开始,并对每个数据元素执行所有有效的突变,直到所有可能的突变都已用尽。这种策略有一定数量的fuzzing迭代。此策略的种子不可配置,始终为31337。

 

7.10.3 随机确定性(默认)

这个fuzzing策略是确定性的(有开始和结尾)。除了突变顺序外,它和顺序策略类似。

7.11 变异器

更多内容很快会补充。目前的变异器列表如下:

ArrayNumericalEdgeCasesMutator

ArrayRandomizeOrderMutator

ArrayReverseOrderMutator

ArrayVarianceMutator

BlobBitFlipperMutator

BlobDWORDSliderMutator

BlobMutator

DataElementDuplicateMutator

DataElementRemoveMutator

DataElementSwapNearNodesMutator

FiniteRandomNumbersMutator

NumericalEdgeCaseMutator

NumericalVarianceMutator

SizedDataNumericalEdgeCasesMutator

SizedDataVarianceMutator

SizedNumericalEdgeCasesMutator

SizedVarianceMutator

StringCaseMutator

StringMutator

UnicodeBadUtf8Mutator

UnicodeBomMutator

UnicodeStringsMutator

UnicodeUtf8ThreeCharMutator

ValidValuesMutator

WordListMutator

XmlW3CMutator

7.12 运行

Peach 3 是一个命令行运行时和很多工具和GUI组成的fuzzer。

7.12.1 命令行

 

7.12.2 图形化程序

Peach fuzz bang

Peach fuzz bang 是一个GUI文件fuzzing工具。这个工具是跨平台的,允许快速fuzzing数据消耗。

Peach Validator

Peach Validator是一个GUI程序,用于视觉验证数据加载到数据模型中。

7.13 最小集

该工具将通过目标程序运行每个样本文件并确定代码覆盖率。然后它将找到覆盖最多代码所需的最少文件数。这应该是在fuzzing时使用的最小文件集。

 

 

 

 

版权声明:本文为baoyu7yi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/baoyu7yi/p/7264971.html