Peach+Fuzzer

目录

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提供了信息。

l  Dumb Fuzzing

l  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时使用的最小文件集。

 

 

 

 

posted @ 2017-07-31 18:51  baoyu7yi  阅读(10475)  评论(0编辑  收藏  举报