Peach+Fuzzer
Posted baoyu7yi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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格式:
l 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,邮箱地址为: [email protected]。
最小班人数 |
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
l Check-sum Fixups
u LRCFixup
l Hashing Fixups
u MD5Fixup
7.3.16 Transformers
Transformers在父元素上执行静态转换或编码。通常来说Transformers是两个方向:编码和解码,但也不全是。 比如ZIP压缩,Base64编码,HTML编码等。与Fixups不同,Transformers对父元素操作,而Fixups引用另一个元素的数据。
上述数据模型的输出为0x01 <len(b64(Data))> <b64(Data)>
Peach 3中的默认Transformers:
l Compression
l Crypto
l Encode
u HtmlEncodeAgressiveTransformer
u Ipv4StringToOctetTransformer
u Ipv4StringToNetworkOctetTransformer
u Ipv6StringToOctetTransformer
l Type
l Misc
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--从远程主机接收数据。
(10)RawIPv6
官网内容不可访问。
(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
DataElementSwapNearNodesMutator
SizedDataNumericalEdgeCasesMutator
SizedNumericalEdgeCasesMutator
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时使用的最小文件集。
以上是关于Peach+Fuzzer的主要内容,如果未能解决你的问题,请参考以下文章