office文档结构解析

转自:https://www.anquanke.com/post/id/175548

http://officeopenxml.com/anatomyofOOXML.php

https://blog.csdn.net/u012107143/article/details/111877587

1
本文系作者此前研究office文件格式解析及漏洞挖掘和分析时梳理的部分基础知识,文章部分内容可能会借鉴他人成果,由于时间久远所以无法一一考证。本文仅限于初学者作为参考,如有笔误,请见谅。

Office文档格式简要介绍

OpenXML(OOXML)是微软在Office 2007中提出的一种新的文档格式,Office 2007中的Word、Excel、PowerPoint默认均采用OpenXML格式。OpenXML在2006年12月成为了ECMA规范的一部分,编号为ECMA376;并于2008年4月通过国际标准化组织的表决,并于两个月后公布为ISO/IEC 29500国际标准。

另一种结构是office 97-03的存储规范:OLE。它是一种对象链接和嵌入的技术,该技术可以包含文本,图形,电子表格甚至其他二进制数据。

Docx(Open XML)文档结构

Docx这种新的word 格式有三个主要的组成部分:部件、内容类型和关系。

部件

部件就是对应于office文档解压后的一个个文件。这些文件都是包中的文档部件。

Word2007的文档部件大致有以下几种:

注释;

格式定义;

列表定义;

页眉;

图表;

关系;

文档内容;

图片。

在word中,使用单独的文件(xml)来表示文档中的每个部分以及附加的内容。他们需要依赖于各部件之间的正确关系保证文件的完整和有效性,如果可以准确保持部件之间的关系,那么文件结构可以任意更改。

以docx文档为例,说明openxml文档内容的结构。随手建立一个docx文档,使用zip解压到文件夹中,他的目录结构如下:

img

事实上,在word2007及以上的版本当中,一个文档则是由一个文件夹(或者说容器),由内部的部件各自定义属性和数据,并相互依赖而产生的。一个文件可能会包含这些目录和组件:

[Content_Types].xml

这个文件描述的是整个文档内容的类型,把各个xml文件组合成一个整体。

docProps文件夹

这个文件夹中的xml记录了docx文档的主要属性信息

Core.xml:描述文件的创建时间,标题,主题和作者等给予open xml约定文档格式的通用文件属性

App.xml:描述文档的其他属性,文档类型,版本,只读信息,共享,安全属性等特定的文件属性

rels 文件夹

这个文件夹存放了所有指定的rels文件

rels文件

这些文件描述了文档结构中的起始关系,也可以叫做关系部件

item1.xml

包含了一些文档中出现的数据。例如自定义XML数据部件。

内容类型

每个文档部件都有一个特定的内容类型。一个部件的内容类型描述了这种文件类型的内容。例如,XML部件包含了Word XML格式定义的标记,而内容类型可以用来分析文档的组成。

典型的内容类型是以word application开头,然后是厂商的名称。在内容类型中,word vender被简写为vnd。所有内容类型都被指定为以application/vnd.ms-word开头。如果内容类型是一个XML文件,那么它的URI将以+xml结尾。其它的非XML内容的类型,例如图片,则没有这种结尾。下面是一些典型的内容类型:

1.application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml

它是一个描述Word文档中的尾注文档部件的内容类型。其中,+xml表示它是一个XML文件。

2.application/vnd.openxmlformats-package.core-properties+xml

它是一个描述核心文档属性部件的内容类型。其中,+xml表示它是一个XML文件。

3.image/png

图片的内容类型。其中没有+xml部分 - 表示内容类型不是XML文件。

部件关系

部件关系记录了文档部件之间的逻辑连接,比如根文档部件拥有一个http://schemas.openxmlformats.org/package/2006/relationships/header类型到application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml
内容类型部件的关系。这表示部件之间的关系是,目标部件是源部件的页眉。而这个页眉部件可能也有自己的关系。在包中,可以通过_rels目录中的.rels文件进行关系定位。

构建关系的方法是:每一个关系中都有一个源一个目的,源是关系命名的部件。例如,document.xml.rels中所有的关系都将document.xml作为它们的源。每个.rels文件都包含一个元素,每个元素都对应一个ID,包括目标部件的内容类型。

img

Doc文档结构

Word 97-03的后缀是doc,doc文件本身是一个ole类型文件。OLE (Object Linking and Embedding)文 件 主 要 由 storages 和 streams
组成,而ole本身其实是一种面向对象的技术,该技术允许程序之间链接和嵌入对象数据,建立复合文档。

img

WordDocument stream 中保存的最重要的数据结构是 FIB(File InformationBlock),FIB 中除了保存 doc文件的一些基本信息(如格式版本)之外,大部分字段是指向其它结构的指针和标识其结构大小(见图2)。例如 fcClx 字段表示 Clx 结构在 Table stream中的偏移,lcbClx 字段标识 Clx结构的大小。类似的,名称以“fc”开头的字段都表示对应结构在某个stream中的偏移,对应的以“lcb”开头的字段则表示其结构大小。

img

rtf文档结构

富文本格式(Rtf, rich text format)是微软的文本和图像信息交换制定的格式。Rtf文件可以划分为文件头和文档区两个部分组成。文件头和文档区由文本、控制字和控制符组成,同时利用{…}来表明层级关系。

Rtf文件内容 控制字 解释
文件头 rtfN 版本号
fonttbl 字体表
filetbl 文件表
listtable 编目表
文档区 info 信息组
pict 图片
object 对象
sv 绘图对象值
sn 绘图对象名称
objupdate 自动更新机制。

(objupdate很重要,攻击样本中经常使用,确保OLE对象自动加载、更新)

OLE简单说明

前面已经说到OLE的基本概念,现在我们先说说不同格式文档的OLE嵌入。OLE就其本质而言,是COM对象的子集,是一种基于组件对象模型(COM)的对象链接和嵌入技术。

不同嵌套控制字及对应的文件格式

OLE对象控制字和相应解释如下:

对象类型 解释
objemb 嵌入图片、文档、音频等
objlink 嵌入链接文件
objautlink 嵌入自动链接对象类型。
objsub Macintosh版管理签署对象类型。
objpub Macintosh版管理发布对象类型。
objicemb MS Word for Macintosh可安装命令(IC)嵌入对象类型。
objhtml 超文本标记语言(HTML)控件对象类型。
objocx 嵌入ActiveX控件

OLE对象数据控制字和对应解释如下:

对象数据 解释
objdata 采用特定格式表示的对象数据;OLE对象采用OLESaveToStream结构。常见恶意文件样本关键字。
objalias Macintosh编辑管理器发行对象的别名记录。
objsect Macintosh编辑管理器发行对象的域记录。

OLE对象数据结构解析

上面的表中,3个对象数据控制字都可以被对象类型引用。OLE对象数据包括头部(ObjectHeader)和数据流(ObjectStream),它们是通过D0CF11E0A1B11AE1
标志符进行区分。其中头部由OLE 版本(4 字节)、格式ID(4 字节)、程序名长度(4字节)、程序名和数据流大小(4字节)组成。用一个CVE-2017-0199溢出文档中嵌入的OLE对象,可以对它做一下解析。对象内容如下:

img

{*objdata
0105000002000000090000004f4c45324c696e6b000000000000000000000a0000d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000fffffffffffffffffffffffffffffffffffffff

上面数据流中加粗字符前面的是OLE对象的头部,各字段解析内容如下:

数据 解释
01050000 OLE Version
02000000 Format ID
09000000 ProgName Size(0x09)
4f4c45324c696e6b00 ProgName (OLE2Link)
000a0000 Data Size

d0cf11e0a1b11ae1后面的数据就是ObjectStream的内容了,解析的时候需要将ascii
转换成hex才可以识别。

img

部分office文档混淆免杀技术

RTF文档格式混淆

文件头混淆

Rtf文档正常的文件头是**{rtf1**,但解析器只识别前四个字节{rt},所以可以通过修改文件头达到样本混淆的效果。

{rt

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 TeX_baitu
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~