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. Access数据库导入到mysql数据库中

    做项目时需要查询手机号归属地的,用网上提供的接口,耗时太长,反应慢,只能自己在网上搜了一个包含所有手机号归属地的Access数据库,导入到自己的mysql数据库中 Access数据库导入到mysql中 ...

  2. eval函数:\的应用

    <?php $string = "beautiful"; $time = "winter"; $str = 'This is a $string $tim ...

  3. 【行为型】TemplateMethod模式

    模板方法意图是为算法定义好骨架结构,并且其中的某些步骤延迟到子类实现.该模式算是较为简单的一种设计模式.在实际中,应用也较为频繁.模式的类关系图参考如下: 模式的编码结构参考如下: namespace ...

  4. lua学习-1

    最近打算学习quick cocos2dx,所以首先打算学习一下lua这门语言,Lua 是一个小巧的脚本语言,轻量级,便于扩展. Lua脚本基本的数据类型:nil.boolean.number.stri ...

  5. close函数

    int close(int sockfd); close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程, 该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或 ...

  6. 实验三:gdb跟踪调试内核从start_kernel到init进程启动

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  7. iOS使用VLC

    简       注册登录 添加关注 作者 牵线小丑2016.03.18 10:42 写了4836字,被38人关注,获得了43个喜欢 iOS使用VLC 字数946 阅读698 评论1 喜欢14 简介 库 ...

  8. 【技术贴】xp任务栏字体变大变小

    今天远程到服务器上,发现任务栏字体变小了,百度了很久,发现百度就是个渣渣,什么答案都搜不到.就自己摸索了一下. 方法一: 桌面右击属性-外观-字体大小, 下拉匡 方法二 :桌面右击[属性]-[外观]- ...

  9. PYTHON--定期监测服务器端口,并将结果写入MYSQL

    定时监测服务器端口,然后将结果入写数据库. 监测用NC命令,入库就用PYTHON的MYSQL模块 再调一个基于函数的多线程... 妥妥的.. 是网上两个功能的合成.. 俺不生产代码,俺只是BAIDU的 ...

  10. 14.4.5 System Tablespace 系统表空间

    14.4.5 System Tablespace 系统表空间 InnoDB 系统表空间包含InnoDB 数据目录(元数据 用于InnoDB相关对象)和是存储区域用于doublewrite buffer ...