Peach3 元素详细解析(二)
4 状态模型
Peach 中有两个创建 fuzzer 的模型,DataModel 和 StateModel。StateModel 重新创建测 试一个协议所必须的基本状态机器逻辑。它定义了怎么给目标发送和接收数据。StateModel 的范围从非常简单到及其复杂。建议在开始时,保持状态模型简单,需要时再进行扩展。
4.1state
state 封装了一个为 Peach 工作的逻辑单元,进而来执行一个大的状态模型。 一些状态 模型仅需要一个状态,而另外一些状态模型则需要许多状态来创建复杂协议模型。state 由 action 组成。 每个 action 可以执行与单个状态如何封装逻辑相关的任务。
属性:
Name—必须的。State 的名字。
有效子元素:Action。
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 被执行。