漏洞文件使用了混淆技术怎么办?我们下面就以PDF文件为例:
对于PDF文件的解析,必须先要熟悉PDF文件各式,貌似所有官方的PDF文件各式文档都是英文的。这样就没办法了,硬着头皮去读呗,如果你对自己的英语够自信那就到这里看吧参考。除此之外就只能找一些国内撰写的相关资料了。熟悉了PDF文件各式之后,怎么解析PDF文件呢?我目前的办法是查 找PDF文件里面的关键字段,这样做的弊端是对于Obj对象里的数据流对象(stream)包含的内容是没办法查找的 。另外也有一些PDF漏洞文件使用了一些混淆技术,这样的PDF文件暂时就没有什么好办法解析了。如下面的情况:
%PDF-1.5
1 0 obj
<#54#79P#65 5 C#61ta#6c#6f#67 Pages 3 O#70e#6e#41c#74i#6fn 0 R>>
endobj
关键字这里就考虑一般的恶意PDF文件,主要是对以下关键字段(个人认为和漏洞不牵扯关系的就不考虑了)进行查找和解析,如下面所示:
·obj
·endobj
·stream
·endstream
·xref
·trailer
·startxref
·/Page
·/Encrypt
·/ObjStm
·/JS
·/JavaScript
·/AA
·/OpenAction
·/AcroForm
·/URI
·/Filter
·/JBIG2Decode
·/RichMedia
·/Launch
解析思路:
这里要说的是几乎每一个PDF文件都包含有前7个字段,也有可能会不包含stream和endstream。据说也有一些PDF文件没有xref或 者trailer,但是这种情况比较少见。如果一个PDF文件没有xref或者trailer关键字段,那么可以确定它不是恶意的PDF文件。
/xref 交叉引用表,描述每个间接对象的编号、版本和绝对的文件位置。PDF文档中的第一个索引必须从版本为65535的0号对象开始,标识符/xref后面的第一个数字是第一个间接对象(即0号对象)的编号,第二个数字是/xref (交叉引用表)的大小。
/Page 指明PDF文件的页数,大多数恶意PDF文件仅仅只有一页
/Encrypt 指明PDF文件有数字水印或者是被加密过的
/ObjStm是object streams的数量。这里要明白object streams是一个可以包含其它Object对象的数据流对象
/JS与/JavaScript 指明PDF文件中含嵌有JavaScript代码。我所见过的PDF恶意文件几乎全部嵌有JavaScript代码,这里一般都是利用 JavaScript 的解析漏洞或者使用JavaScript 来实现堆喷射(heap spray)。当然要注意,在很多正常的PDF文件里也可以发现含有JavaScript 代码
/AA、/OpenAction和/AcroForm 指明当查看PDF文件或者PDF的某页时会有自动的动作随其执行,几乎所有嵌有JavaScript代码的恶意PDF文件都有自动执行 JavaScript代码的动作(action )。如果一个PDF文件包含/AA或/OpenAction 自动执行动作的关键字段,而且又含有JavaScript 代码,那么这个PDF文件就极可能是恶意的PDF文件
/URI 如果你要在PDF文件中执行打开网页的动作的话就需要这个关键字段
/Filter 一般为FlateDecode即使用zlib压缩解压缩算法,
/JBIG2Decode 指明PDF文件使用了JBIG2压缩。虽然JBIG2压缩本身可能会存在漏洞(CVE-2010-1297)。但/JBIG2Decode关键字段并不能说明PDF文件是否可疑
/RichMedia Flash文件
/Launch 执行动作(action)数量
最后的工作就是检查PDF文件的各个对象以及对象之间是否符合Adobe的PDF文件格式规范。并综合上面描述的各关键字段信息分析该PDF文件是否可能为恶意文件。