Peach平台依赖许多的脚本文件,这些脚本按照功能的不同,存放在不同的文件夹下,通过相互调用来完成畸形测试用例的生成和对目标测试软件运行过程的跟踪。具体目录脚本与功能对照如表11-1所示。
不同模块的脚本,用户可以按照一定的规则自行的定义添加,通过扩展脚本,可以进一步的提高测试的效率。
11.4 使用介绍
Peach的使用依赖一个XML文件,该文件中定义了测试用例的生成策略、变异策略、对待测目标的测试逻辑和需要监控的信息。使用Peach实际上主要工作就是定义这样一个XML文件指示Peach引擎完成测试。通常把这样的XML代码文件叫做peach pit。
11.4.1 Peach pit基本格式
打开工具安装目录可以看到有一个sample子目录,里面有若干工具提供的.xml文件(peach pit文件),其基本格式如下。
<Peach …版本,作者介绍之类…>
<Include ...注意有两个文件必须包含/>
<DataModel >
…原始数据结构定义…
</DataModel>
<StateModel >
…测试逻辑,如收到什么样的数据包之后,发出什么样对应的数据包…
</StateModel>
<Agent >
…检测exception,crash等…
</Agent>
<Test >
…指定将要使用的state,agent,publisher等…
</Test>
<Run >
…Fuzzer执行的入口点,相当于main…
</Run>
</Peach>
Peach pit具体说明:
1.整个文件由一个标签<Peach></Peach>包含。
2.文件中的第二级标签有且仅有Include、DataModel、StateModel、Agent,Test,Run等6种,但不是必须全部出现。
3.Include包含的外部文件中defaults.xml和PeachTypes.xml是必须的,这两个文件含有Peach的基本方法、类、数据类型等信息。
4.DataModel用于定义数据结构,此标签下有若干级子标签。使用这些子标签可以轻易的定义数据的类型、长短、各个数据块之间的关系,甚至CRC校验等信息也可以轻易定义。Peach pit 可以定义多个DataModel,多个DataModel之间可以有关系也可以根本无关。
DataModel包含的常用数据模型如下:
■ String:字符串类型。
■ Number:数字型。
■ Blob:无具体数据类型。
■ Block:用于对数据进行分组。
例如,如下的DataModel模块定义:
<DataModel name="HelloData">
<String name="ID" size="32" value="RIFF" isStatic="true" />
<Block name="TypeAndData">
<Number name="Type" size="16"/>
<Blob name="Data"/>
</Block>
</DataModel>
要注意的是,size 的单位是bit。上面的例子中,"ID"的"size"为32,表示"ID"的长度为4字节(1 byte = 8 bits),值"RIFF"也正是4个字节。
5.StateModel用于定义测试逻辑,实际是一个状态机,用于描述如何向目标程序发送/接收数据。StateModel 由至少一个State 组成,并且用initialState指定第一个State;每个State 由至少一个Action组成,Action 用于定义StateModel中的各种动作,动作类型由type 来指定。Action支持的动作类型包括start、stop、open、close、input、output、call等。
例如,如下的StateModel模块定义:
<Action type="input">
<DataModel ref="InputModel" />
</Action>
<Action type="output">
<DataModel ref="SomeDataModel" />
<Data name="sample" filename="sample.bin"/>
</Action>
<Action type="call" method="DoStuff">
<Param name="param1" type="in">
<DataModel ref="Param1DataModel" />
</Param>
</Action>
<Action type="close" />
第一个Action描述了一个输入型动作,表示按照数据模型InputModel产生数据并作为输入数据;第二个Action描述了一个输出型动作,表示按照数据模型SomeDataMode产生数据并输出到文件sample.bin中;第三个Action描述了一个调用动作,表示调用函数DoStuff,并且将按照数据模型Param1DataModel产生的数据作为函数DoStuff的参数;第四个Action描述了一个关闭程序的动作。当代码中存在多个Action时,则从上至下依次执行。
6.Agent元素用于定义代理和监视器,可以调用WinDbg 等调试器来监控程序运行产生的错误信息。一个Peach Pit 文件可以定义多个Agent,每个Agent 下可以定义多个Monitor。
例如,如下的Agent模块定义:
<Agent name="LocalAgent" location="http://127.0.0.1:9000">
<Monitor class="debugger.WindowsDebugEngine">
<Param name="CommandLine" value="notepad.exe fileName" />
</Monitor>
<Monitor class="process.PageHeap">
<Param name="Executable" value="notepad.exe" />
</Monitor>
</Agent>
第一个Monitor类型为debugger.WindowsDebugEngine,通过调用WinDbg 来执行命令"notepad.exe filename"。第二个Monitor 类型为process.PageHeap,表示为notepad.exe开启页堆调试(Page Heap Debug),这在大多数Windows Fuzzing 中都是很有用的。
7.Test元素用来定义一个测试的配置,包括一个StateModel模块和一个Publisher模块,以及includeing/excluding、Agent信息等。其中StateModel和Publisher是必须定义的,其他是可选的。
下面是一个Test配置的例子:
<Test name="TheTest">
<Exclude xpath="//Reserved" />
<Agent ref="LocalAgent" />
<StateModel ref="TheState" />
<Publisher class="file.FileWriter">
<Param name="fileName" value="FuzzedFile"/>
</Publisher>
</Test>
Publisher用来定义Peach的IO连接,可以构造网络数据流(如TCP、UDP、HTTP)和文件流(如FileWriter,FileReader)等。上例中的Publisher 定义表示将生成的畸形数据存储到FuzzedFile文件中。
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。