通过源码学习peach的使用
字数 2977 2025-08-29 22:41:24
Peach模糊测试工具使用指南
1. Peach简介
Peach是一个功能强大的模糊测试框架,支持多种版本:
- Peach2:使用Python2编写,环境搭建困难且文档较少
- Peach3和Peach4:使用C#编写,本文主要分析Peach4
2. 环境搭建
2.1 准备工作
- 安装TypeScript 1.8以下版本:
npm install -g typescript@1.8 - 安装Ruby 3.4,但环境变量指向Ruby2.7/bin目录
- 使用管理员权限安装:
- Java
- xsltprocs
- git
- 安装最新版doxygen
- 安装Visual C++ Redistributable for Visual Studio 2012 Update 4
2.2 编译环境
- 使用命令生成sln文件:
waf.bat msvs2017 - 将启动项目设为peach
- 为peach项目指定pit文件作为命令行参数
3. PIT文件基础
PIT文件是XML格式的配置文件,包含三个基本元素:
- DataModel:定义协议格式
- StateModel:定义协议状态机
- Test:指定运行时配置
3.1 DataModel通用参数
name:元素标识mutable:是否变异(默认true)occur相关参数:minOccurs:最少出现次数(默认1)maxOccurs:最多出现次数(默认1)occurs:实际出现次数(默认1)
4. DataModel元素类型
4.1 Block
- 用于统一操作多个元素
- 关键参数:
ref:引用其他Block或DataModel
4.2 Number
- 定义整数(字节码数据)
- 关键参数:
size:bit为单位(最大64)signed:是否有符号(默认false)endian:大小端(默认小端)value:默认值valueType:值格式(string或hex,默认string)
4.3 Double
- 定义浮点数
- 关键参数:
size:32或64 bitsigned:是否有符号endian:大小端value:默认值(支持科学计数法)valueType:值格式
4.4 Blob
- 定义数据块
- 关键参数:
length:长度lengthType:bytes或bits(默认bytes)value:默认值valueType:值格式token:是否为token(默认false)
4.5 Choice
- 包含多个子元素
- 变异时从子元素中选择一个
- 建议将子元素的
mutable设为false
4.6 Flag
- 本质上是Number
- 通过Flags包裹可支持数组相关变异策略
4.7 Padding
- 填充数据包
- 关键参数:
alignment:对齐bit数(默认8)alignedTo:指定对齐元素minSize:最少填充bit数(默认0)
4.8 String
- 定义字符串
- 关键参数:
length:长度lengthType:bytes、bits或chars(默认bytes)nullTerminated:是否以00结尾(默认false)padCharacter:填充字符type:编码类型(默认utf8)value:默认值valueType:值格式
5. Relation元素
用于统计其他字段信息:
5.1 长度计算
<Relation type="size" of="元素名"/>
5.2 表达式运算
<Relation type="size" of="元素名"
expressionSet="size*2"
expressionGet="size/2"/>
5.3 重复次数计算
<Relation type="count" of="元素名"/>
5.4 偏移计算
- 相对于数据包头部:
<Relation type="offset" of="元素名"/> - 相对于Relation所在元素:
<Relation type="offset" of="元素名" relative="true"/> - 相对于指定元素:
<Relation type="offset" of="元素名" from="参考元素"/>
6. Fixup功能
6.1 校验和计算
<Fixup class="Checksum">
<Param name="ref" value="待校验元素"/>
<Param name="type" value="算法类型"/>
</Fixup>
6.2 自定义校验和(Python)
- 编写Python模块:
class MyChecksum: def __init__(self): pass def fixup(self, data): # 处理C#类型数据,返回整型 return checksum - 导入模块:
<Import import="文件名"/> - 绑定元素:
<Fixup class="ScriptFixup"> <Param name="class" value="文件名.类名"/> <Param name="ref" value="元素名"/> </Fixup>
6.3 Hash计算
<Fixup class="Hash">
<Param name="ref" value="元素名"/>
<Param name="type" value="算法类型"/>
</Fixup>
6.4 序列号生成
- 递增序列号:
<Fixup class="Sequence"> <Param name="ref" value="元素名"/> <Param name="type" value="increment"/> </Fixup> - 随机序列号:
<Fixup class="Sequence"> <Param name="ref" value="元素名"/> <Param name="type" value="random"/> </Fixup>
6.5 值拷贝
<Fixup class="CopyValue">
<Param name="ref" value="源元素"/>
<Param name="from" value="目标元素"/>
</Fixup>
7. Transformer
对元素进行编码:
<Transformer class="编码类型">
<Param name="ref" value="元素名"/>
</Transformer>
8. Hint
为字段添加特定变异器:
<Hint name="NumericalString"/>
<Hint name="TypeTransform"/>
9. 变异器(Mutator)
9.1 状态变异器(StateMutator)
- ActionDuplicate
- ActionRemove
- ActionSwap
- StateChangeRandom
9.2 数据变异器(DataMutator)
在Test标签中使用include和exclude选择变异器:
9.2.1 数组相关
- ArrayEdgeCase:Sequence且元素数量≠0
- ArrayRandomizeOrder:Sequence且元素数量>1
- ArrayReverseOrder:Sequence且元素数量>1
- ArrayVariance:Sequence且元素数量≠0
9.2.2 Blob相关
- BlobChangeFromNull:Blob且内容不为空
- BlobChangeRandom:Blob且内容不为空
- BlobChangeSpecial:Blob且内容不为空
- BlobChangeToNull:Blob且内容不为空
- BlobExpandAllRandom:Blob
- BlobExpandSingleIncrementing:Blob
- BlobExpandSingleRandom:Blob
- BlobExpandZero:Blob
- BlobReduce:Blob且内容不为空
9.2.3 其他重要变异器
- ChoiceSwitch:Choice且选项>1
- DataElementBitFlipper:所有元素且内容不为空
- DataElementDuplicate:非Choice/Flag且内容不为空
- DataElementRemove:非Choice/Flag且父元素不为空
- DataElementSwapNear:非Flag且存在下一个元素
- StringSqlInjection:字符串
- StringUnicode*:多种Unicode相关变异器
10. 变异策略(Strategy)
10.1 Sequential
- 对所有
mutable=true的元素依次使用所有变异器 - 每次只变异一个元素
10.2 RandomStrategy
- 随机选择最多N个元素进行变异(默认N=6)
- 每个元素随机使用变异器
10.3 RandomDeterministicStrategy
- 随机使用所有变异器
- 依次使用变异器返回的结果
- 每次只变异一个元素
11. 实用技巧
- 调试模式:
peach --debug - 指定随机种子:
peach --seed 123 - 第一个数据包为原始数据包,不会变异
12. 与Boofuzz对比
| 特性 | Peach | Boofuzz |
|---|---|---|
| 变异器数量 | 较多 | 较少 |
| 变异策略 | Sequential/Random/RandomDeterministic | 单一策略 |
| 数据定义 | XML格式直观 | 函数调用方式 |
| 状态定义 | 文档较少 | 直接connect |
| 自定义函数 | 需C#类型转换 | Python原生支持 |
| 结果查看 | 需实时抓包 | SQLite数据库+网页查看 |
13. 总结建议
- 单一状态网络模糊测试:建议使用Peach
- 多状态或需要自定义函数:建议使用Boofuzz
- 文件格式模糊测试:Peach提供更多专用标签