如何解析.doc文件格式
2008年2月,微软公开了Office二进制文件格式规范。这些规范描述了如何解析Word、Excel和PowerPoint文件以审查或提取内容。由于详细描述了这些文件格式的结构,我们认为该规范对编写恶意软件扫描器(如防病毒软件)检测逻辑的ISV特别有意义。让我们通过研究使用这种传统二进制文件格式创建的Word文档的解析基础来开始深入研究这些文档。本文不讨论Word 2007中引入的新OOXML格式。
复合二进制格式
首先,要解析这些旧格式,您需要了解复合二进制文件格式。该格式的规范可在网上找到。经检查,您可以看到该格式类似于文件系统,类似于FAT。有称为存储的目录,其中包含名为流的数据文件。所有这些数据都可能分散在文件的各个扇区中,由内部FAT描述。有可用的库来解析这种格式,因此如果您不想重新发明轮子,可以使用Windows COM API(从StgOpenStorageEx函数开始)或几个免费可用的解析器和查看器之一来提取单个数据流。复合二进制文件实际上非常常见,COM API是访问这些文件中存储数据的好方法。
Word数据的高级结构
在有效的Word文档中,存在一个名为WordDocument的流。继续查看此流的内容。它以一个名为文件信息块(FIB)的结构开始,该结构在Word二进制文件格式规范的第141页有描述。这个庞大的结构既包含数据,又充当文档其余部分的指南图。在FIB的偏移量0x9A处,您将找到一个名为Rgfclcb的占位符值。这标志着偏移/长度对的开始,这些对描述了文档其余部分的结构位置。这些是偏移量到另一个名为0Table或1Table的流中。要找出引用这两个流中的哪一个,请检查FIB偏移量0xA处的16位值,并查看第10位(用0x200进行AND操作)。如果该位为0,则偏移量引用0Table流。如果为1,则引用1Table流。
这个xTable流包含Word用于在屏幕上构建文档的大部分格式数据。每个偏移量指向不同的结构,因此请查看Word二进制文件规范以获取有关存储在特定Table流位置的数据的更多详细信息。
实际示例
现在,让我们将这些信息与一些关于已修补漏洞的细节结合起来,看看如何检测可能的漏洞利用尝试。MS06-060修复了打印合并状态(PMS)结构中的一个漏洞,该结构存储在一个xTable流中。
首先,使用上述方法确定此文档是使用0Table还是1Table流。
接下来,我们必须找出文档中是否存在PMS结构,如果存在,其在xTable流中的偏移量是多少。FIB中有两个可能存储此结构位置的地方:fcPms和fcPmsNew。首先检查fcPms。该偏移值的相应长度值称为lcbPms,它是一个位于FIB偏移量0x1FE的DWORD。如果该值非零,则FIB偏移量0x1FA处的fcPms DWORD包含我们需要的xTable偏移量。如果长度值为0,则需要检查第二个可能的位置,即FIB偏移量0x48A处的fcPmsNew。此值的长度值称为lcbPmsNew,位于FIB偏移量0x48E。如果此DWORD为0,则文档不包含PMS结构。如果非零,则DWORD fcPmsNew包含PMS结构在xTable流中的偏移量。
最后,如果文档确实包含PMS结构,请在您之前确定的表流中,在刚从FIB读取的偏移量处检查它。该结构如下:
|
|
在此结构中,有四个感兴趣的字节,名为One、Two、Three和Four。验证One和Two的值是否设置为0或1。对于Three和Four,验证这些值是否在0到5(包括)的范围内。这些字段的任何其他值都是无效的,文档应被标记为可能滥用MS06-060漏洞。
在以下示例中,WordDocument流从文件偏移量0x1C00开始,1Table流从文件偏移量0xC00开始。在发现lcbPms(在0x1C00 + 0x1FE处)非零后,我们查看0xC00 + 0x1A6处的PMS结构,并看到名为“Three”的值大于5,因此此文档可能试图利用MS06-060。
我们希望您发现这是一个有用的示例,说明如何使用Word二进制文件格式规范来准确描述和检测利用特定安全漏洞的尝试。