模糊测试之实例讲解

释放双眼,带上耳机,听听看~!
什么是模糊测试 ?模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。测试的基本思想就是通过向程序中输入大量的随机数据,然后观察输入这些数据之后程序的情况,记录下使程序发生异常的数据,从而判断程序是在那些地方发生了异常。&nbs

什么是模糊测试  ?
模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。测试的基本思想就是通过向程序中输入大量的随机数据,然后观察输入这些数据之后程序的情况,记录下使程序发生异常的数据,从而判断程序是在那些地方发生了异常。
                           
                                               
                           

本文作者:i春秋签约作家——天天

模糊测试的实现是一个非常简单的过程:

1. 准备一份插入程序中的正确的文件。

2. 用随机数据替换该文件的某些部分。

3. 用程序打开文件。

4. 观察破坏了什么。

Peachfuzzer    Peachfuzzer 是一款先进的且可扩展的安全测试平台,这款软件适用于软件测试人员企业的安全保证团队,以及测试实验室用来自动的发现软件的脆弱性和软件的突变的应对方法。

                  

   Peachfuzzer is an advanced and extensible security testing
platform. This software enables software testers, enterprise quality
assurance teams, and testing labs to find vulnerabilities in software
using automated generative and mutational methods.

Peach-pitPeach所使用的Peach Pit文件包含了以下5个模块:

GeneralConf

DataModel

StateModel

Agents and Monitors

Test and Run Configuration

下面分别介绍这5个模块的定义方法,并完成一个简单的HelloWorld程序。

题外话:在这之前,我们需要准备一个好用的XML文件编辑器,Visual Studio,Open XML Editor或者Notepad++都是不错的选择。这里我使用的是Notepad++,它集成了数十种语言的语法着色方案,并且,它安装完后只有10MB左右。

首先,我们先搭好一个XML框架,下面要写的所有元素都要被包含在根元素<Peach>里。

<?xml version="1.0" encoding="utf-8"?>[/align]    <Peach xmlns=http://phed.org/2008/Peach
    xmlns:xsi="http://www.w3.org/ 2001/ XMLSchema-instance"
           xsi:schemaLocation=http://phed.org/2008/Peach ../peach.xsd >
           <!-- add elements here -->
[align=left]</Peach>

其中,Peach元素的各个属性基本是固定的,不要轻易改动。

(1)GeneralConf

GeneralConf是Peach Pit文件的第一部分,用来定义基本配置信息。具体来说,包括以下三种元素。

Include:要包含的其他Peach Pit文件。

Import:要导入的python库。

PythonPath:要添加的python库的路径。

要注意的是,所有的Peach Pit文件都要包含default.xml这个文件。

在HelloWorld中,GerneralConf部分只需写入如下内容。

<Include ns="default" src="file:defaults.xml" />

(2)DataModel

DataModel元素用来定义数据模型,包括数据结构和数据关系等。一个Peach Pit文件中需要包含一个或者多个数据模型。DataModel可以定义的几种常用的数据类型如下。

String:字符串型。

Number:数据型。

Blob:无具体数据类型。

Block:用于对数据进行分组。

比如:

<DataModel name="HelloData">[/align]    <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个字节。

在HelloWorld程序中,仅定义一个值为”Hello World!”的String类型数据。

<DataModel name="HelloWorldTemplate">[/align]    <String value="Hello World!" />
    </DataModel>

(3)StateModel

StateModel元素用于描述如何向目标程序发送/接收数据。StateModel由至少一个State组成,并且用initialState指定第一个State;每个State由至少一个Action组成,Action用于定义StateModel中的各种动作,动作类型由type来指定。Action支持的动作类型包括start、stop、open、close、input、output、call等。下面是一个例子:

<Action type="input">[/align]        <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时,则从上至下依次执行。

在HelloWorld程序中,我们只需要接收数据模型”HelloWorldTemplate“中的数据,所以写出如下的StateModel。

<StateModel name="State" initialState="State1" >[/align]    <State name="State1"  >
        <Action type="output" >
            <DataModel ref="HelloWorldTemplate"/>
        </Action>
    </State>
    </StateModel>

(4)Agent

Agent元素用于定义代理和监视器,可以用来调用WinDbg等调试器来监控程序运行的错误信息等。一个Peach Pit文件可以定义多个Agent,每个Agent下可以定义多个Monitor。下面是一个例子:

<Agent name="LocalAgent" location="http://127.0.0.1:9000">[/align]     <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中都是很有用的。

在HelloWorld程序中,我们不需要启用WinDbg调试,所以无需配置Agent。

(5)Test and Run configuration

在Peach Pit文件中,Test and Run configuration 包括 Test 和 Run 两个元素。

Test元素用来定义一个测试的配置,包括一个StateModel和一个Publisher,以及includeing/excluding、Agent信息等。其中StateModel和Publisher是必须定义的,其他是可选定义的。下面是一个Test配置的例子。

<Test name="TheTest">[/align]        <Exclude xpath="//Reserved" />    
            <Agent ref="LocalAgent" />   
            <StateModel ref="TheState" />
            <Publisher class="file.FileWriter">
          <Param name="fileName" value="FuzzedFile"/>         
        </Publisher>
    </Test>

先对Publisher做一下介绍。Publisher用来定义Peach的IO连接,可以构造网络数据流(如TCP,UDP,HTTP)和文件流(如FileWriter,FileReader)等。上例中的Publisher定义表示将生成的畸形数据写到FuzzedFile文件中。

在HelloWorld程序中,需要做的仅仅是把生成的畸形数据显示到命令行,所以Publisher用的是标准输出stdout.Stdout。

<Test name="HelloWorldTest"> [/align]        <StateModel ref="State"/>
    <Publisher class="stdout.Stdout" />
    </Test>

现在到了最后一步,Run的配置。Run元素用来定义要运行哪些测试,包含一个或多个Test,另外还可以通过Logger元素配置日志来捕获运行结果。当然,Logger也是可选的。

<Run name="DefaultRun">[/align]        <Test ref="TheTest" />
            <Logger class="logger.Filesystem">
                <Param name="path" value="c:\peach\logtest" />
        </Logger>
    </Run>

上例表示程序运行”TheTest”这个测试,并且把运行日志记录到C:\peach\logtest目录下。

在HelloWorld程序中,只需要在Run配置中放入之前定义好的HelloWorldTest就可以了。

<Run name="DefaultRun">[/align]    <Test ref="HelloWorldTest" />
    </Run>

示例测试过程   下面我们就最简单的测试程序为例,来讲解一下用peach进行模糊测试的基本过程。

   我们所用的peach-pit文件是helloworld.xml文件,它在打印输出helloworld字符串之后会自动的生成很多的变种字符串,包括超长串和null缺失的非法串等,几乎只要是可以造成程序出错的串都会涉及到。

以下是完整的代码:

<?xml version="1.0" encoding="UTF-8"?>
<Peachxmlns="http://phed.org/2008/peach"xmlns:xsi="http://www.w3.org/2001/XMLschema-instance" xsi:schemalocation="http://phed.org/2008/peach ../peach.xsd" version="1.0"
  author="Michael Eddington" description="Hello World Example" />
  <Include ns="default"src="file:defaults.xml" />
<DateModel name="HelloWorldTemplate">
<String value="hello world!" />
</DateModel>
<StateModel name="State" initialState="State1">
<State name="State1">
<Action type="output">
<DateModl ref="HelloWorldTemplate" />
</Action>
</State>
    </StateModel>
    <Test name="HelloWorldTest">
<StateModel ref="State"/>
<Publisher class="stdout.Stdout"/>
</Test>
<Run name="DefaultRun" description="Stdout HelloWorld Run">
<Test ref="HelloWorldTest"/>
</Run>
</peach>

然后运行以上pit文件。

封面.png

给TA买糖
共{{data.count}}人
人已赞赏
HackerNews

2017中国人工智能技术与应用峰会

2017-8-24 3:22:06

HackerNews

利用快捷方式打开妹子心门的一次尝试

2017-8-25 3:06:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索