MyException - 我的异常网
当前位置:我的异常网» 信息/网络安全 » 模模糊糊测试之实例讲解

模模糊糊测试之实例讲解

www.MyException.Cn  网友分享于:2013-09-10  浏览:0次
模糊测试之实例讲解

什么是模糊测试 ? 模糊测试(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

文章评论

5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的鄙视链
程序员的鄙视链
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员应该关注的一些事儿
程序员应该关注的一些事儿
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老程序员的下场
老程序员的下场
每天工作4小时的程序员
每天工作4小时的程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
代码女神横空出世
代码女神横空出世
如何成为一名黑客
如何成为一名黑客
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
漫画:程序员的工作
漫画:程序员的工作
我的丈夫是个程序员
我的丈夫是个程序员
10个调试和排错的小建议
10个调试和排错的小建议
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员必看的十大电影
程序员必看的十大电影
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
一个程序员的时间管理
一个程序员的时间管理
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我是如何打败拖延症的
我是如何打败拖延症的
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
编程语言是女人
编程语言是女人
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
那些争议最大的编程观点
那些争议最大的编程观点
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
中美印日四国程序员比较
中美印日四国程序员比较
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
 程序员的样子
程序员的样子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有