IE、Office 等软件有个共同点,即用文件作为程序的主要输入,但攻击者往往会挑战程序员的假定和假设。

文件格式 Fuzz 就是利用畸形文件测试软件的稳健性,其流程一般包括:

* 以一个正常文件作为模板,按规则产生一批畸形文件
* 将畸形文件逐一送往软件进行解析,并监视异常
* 记录错误信息,如寄存器、栈状态
* 进一步分析日志等异常信息,鉴定漏洞和利用性

Blind Fuzz

即盲测,在随机位置插入随机数据产生畸形文件。

现代软件往往使用非常复杂的私有数据结构,如 PPT、word、excel、mp3、rmvb、pdf、jpeg、zip、加壳 PE。数据结构越复杂,解析逻辑越复杂,就越容易出现漏洞。

复杂的数据结构通常具备以下特征:

* 有一批预定义的静态数据,如 magic、cmd id 等
* 数据结构的内容可以动态改变
* 数据结构之间嵌套
* 数据中存在多种数据关系(sizeof、point to、reference of、CRC)
* 有意义的数据被编码或压缩,甚至用另一种文件格式存储,被挖掘出越来越多的漏洞

对于采用复杂数据结构的文件,Blind Fuzz 暴露出不足:测试用例缺少针对性,产生大量无效用例,难以发现复杂解析器的深层逻辑漏洞。

Smart Fuzz

针对 Blind Fuzz 的不足,Smart Fuzz 被越来越多地提出和应用。Smart Fuzz 有三个特征:面向逻辑、面向数据类型、基于样本。

面向逻辑,测试前明确要测试的目标是解析文件的程序逻辑,确定测试用例所试探的是哪一层解析逻辑,即明确“深度”以及畸形数据的“粒度”,这样在生成畸形数据时可以具有针对性的仅仅改动样本文件的特定位置,尽量不破坏其他数据的依赖关系。

面向数据类型,能够识别不同的类型,并且能够针对目标数据类型按照不同规则来生成畸形数据,可以生成算术类型 hex ascii unicode raw、指针型、字符串型、特殊字符型。这种方法产生的畸形数据通常都有效,能够大大减少无效用例。

基于样本:每次都从样本模板小幅度变异生成新的测试样本。但不能测试样本文件中没有包含的数据结构,所以需要有能包含所有数据结构的样本。

这三种 Fuzz 特性并不是相互独立的,可以同时使用。好的 Smart Fuzz 工具中,三种特性都会包含。

文件 Fuzz 工具 Peach 介绍

Peach 是用 Python 写的开源工具,支持基于生长(用随机或启发性的数据来填充给定的数据模型)和基于变异的两种文件生成方式。

Debug 系统需要安装 WinDbg,Debug 协议需要安装 Wireshark 或者 Winpcap。

Peach 有 EXE 和 Python 源码两种版本,可以跨平台。Peach 使用 XML 来定义数据结构,可以定义数据之间的依存关系如校验值等。

书中有个用 Peach 来 Fuzz PNG 格式文件的例子,可以参考。

010 脚本解析复杂文件

010 Editor 是一款非常强大的文本 / Hex 编辑器,包括文件解析、计算器、文件比较等功能。

010 Editor 真正强大之处在于文件解析功能,其官网提供了针对多种文件格式(avi bmp png exe 等)的解析脚本。脚本编写使用类似 C/C++ 的语法,灵活度很高。

书中有一个利用 010 Editor 触发 GdiPlus.dll 在处理 IHDR 时的整数溢出漏洞,造成拒绝服务攻击(CPU 100%)。(CVE-2006-7210?

PPT 文件解析

Office 系列软件使用的文件格式可以分为两个系列:

* Office ~Office :使用基于二进制的文件格式,文件名后缀为doc、ppt、xls等
* Office2003及更高版本:使用基于XML的文件格式,文件名后缀为docx、pptx、xlsx等

这里主要讨论二进制 PPT 文件格式。

测试深度
解析逻辑
数据粒度
Fuzz 方法
Level1
OLE2 解析器
离散分布的 512 字节数据段
修改 OLE 文件头、FAT 区块、目录区块等位置的数据结构
Level2
PPT 记录解析器
流和信息库
修改流中的数据,破坏记录头和数据的关系
Level3
PPT 对象创建器
原子和容器
用负载替换原子数据
Level4
PPT 对象内部逻辑
原子记录内部的 integer、bool、string 等数据
用相关的负载集修改字节数据

PPT 的有效数据被组织在基于 OLE2 的二进制文件中。OLE2 文件把数据组织成流(Stream)进行存储。数据流在逻辑上连续存储,在硬盘上则离散存储。如果直接用十六进制编辑器打开一个 OLE2 文件,将会看到许多大小为 512 字节的离散的数据块,并且在文件的开头有一个存储了这些数据块索引的 FAT 表。OLE2 的 FAT 表跟 FAT32 文件系统的索引很相似。(书的附录有 OLE2 的 010 Editor 脚本)

PPT 的有效数据存储在 OLE2 的 stream 中,通常一个 PPT 文件包括以下几种 stream:

数据流
说明
Current User
最近打开演示文档的用户信息
PowerPoint Document
文档中的数据信息
Pictures(Optional)
文档中的图像信息
Summary Information
文档中的一些统计信息
Document Summary Information(Optional)
文档中的一些统计信息

PowerPoint Document 数据流中包含了我们感兴趣的大部分信息,如 font、color、text、position 等数据结构。下面着重讨论 PowerPoint Document 数据流的解析。

PowerPoint Document 数据流中,数据以若干个"记录(Record)"的形式存储。每个记录都包含一个 8 字节的 header,根据 header 的不同,记录又可分为容器(Container)和原子(Atom)两种类型。其中,容器可以包含原子和其他容器,而原子则包含了 PowerPoint 对象的真正数据。

微软已经公布了 PPT 文件中所有记录(record)的格式说明,这就不难从 OLE2.bt 解析出的数据流中进一步解析出所有 PPT 的原子和容器结构。如果动手编程,不难发现这实际上是一个树的遍历问题。在随书资料中给出了一个简单的 010 解析脚本 ppt_parse.bt。执行ppt_parse.bt脚本,即可得到PPT的解析结果。

FTP Fuzzing

书中介绍了一款 infigo ftpstress fuzzer,配置选项很多,fuzz FTP 时可作首选。

SMTP、POP3、IMAP4、路径回溯、XSS

书中针对以上几个协议/主题都有 Fuzz 例子,总结经验如下:

* Python 测试确实方便,对于很多协议都有封闭包,非重点的地方直接使用包,需要自定义的地方(如匿名登录 POP3)稍修改即可

* 测试时要细致,不留死角。例如路径回溯,传入服务器等程序的参数中、客户端的内存中(直接调试修改)都可以作文章

OD: File Vulnerabilities & Protocols & Fuzz的更多相关文章

  1. OD: ActiveX Vulnerabilities

    通过一个精心构造的页面 exploit 第三方软件中的 ActiveX 已经成为一种惯用攻击手段,众多知名软件公司都曾被发现其注册的 ActiveX 中存在严重的缓冲区溢出漏洞,一个被广泛使用的第三方 ...

  2. OD: Kernel Vulnerabilities Analyze

    内核漏洞大多出没于 ring3 到 ring0 的交互中.从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞.例如:驱动程序中 IoControl 的处理函数,SS ...

  3. OD: Kernel Vulnerabilities

    内核漏洞概述 内核漏洞的分类 运行在 Ring0 上的操作系统内核.设备驱动.第三方驱动能共享同一个虚拟地址空间,可以完全访问系统空间的所有内存,而不像用户态进程那样拥有独立私有的内存空间.由于内核程 ...

  4. Trivial File Transfer Protocol (TFTP)

    Assignment 2The Trivial File Transfer Protocol (TFTP) is an Internet software utility fortransferrin ...

  5. od源代码

    ```/* od -- dump files in octal and other formats Copyright (C) 92, 1995-2002 Free Software Foundati ...

  6. PatentTips – EMC Virtual File System

    BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention generally relates to net ...

  7. Extension of write anywhere file system layout

    A file system layout apportions an underlying physical volume into one or more virtual volumes (vvol ...

  8. 使用sublime编写c/c++ 总结

    大块头IDE Visual studio太大了,记事本也能写代码但无疑是装逼过分了.写一些轻量级的c/c++代码使用sublime来写是个很好的选择. 三步走: 编译器(win下安装了vs就使用cl, ...

  9. minicom 使用教程

    因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB#. minicom,tkterm都是linux下应用比 ...

随机推荐

  1. JSON基础知识总结

    JSON基础 一.JSON简介 JSON,全称“JavaScript Object Notation(JavaScript对象表示法)”,起源于JavaScript的对象和数组.JSON,说白了就是J ...

  2. ORA-00933 UNION 与 ORDER BY

    原文:http://blog.csdn.net/lwei_998/article/details/6093807 The UNION operator returns only distinct ro ...

  3. jquery实现页面置顶功能代码

    <html> <head> <title></title><script type='text/javascript> //回到顶部功能 f ...

  4. Python展开一个嵌套的序列

    摘自<Python Cookbook> 4.6 任务 序列中的子序列可能是序列,子序列的子项仍有可能是序列,以此类推,则序列嵌套可以达到任意的深度.需要循环遍历一个序列,将其所有的子序列展 ...

  5. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  6. 倒水问题-->经典面试题目

    题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满 ...

  7. JavaScript and html的关系

    HTML--------------------------->DOM, BOM, Event Request/Response------------->Ajax 日期处理 http:/ ...

  8. 【转】Java 中字符串的格式化

    原文网址:http://blog.csdn.net/aimartt/article/details/8307237 参考资料:JDK API 1.6.0 中文文档 1.格式字符串语法 产生格式化输出的 ...

  9. throw new DataException("检查服务器是否存在失败:" + ex);

    try            { }            catch (Exception ex)            {                LogHelper.Error(" ...

  10. [置顶] 【Git入门之九】解决冲突

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309531 1.多人协作冲突 如果多人同时修改了同一个文件,那会出现什么样 ...