可移植文档格式(PDF)是一种文件格式,可用来独立于软件、硬件或操作系统可靠地呈现和交换文档。PDF 是由 Adobe 发明的,现已成为由国际标准化组织 (ISO) 维护的一个开放式标准。PDF 可以包含链接和按钮、表单域、音频、视频和业务逻辑。
PDF 文件格式
文件尾(Trail),说明根对象的对象号,并且说明交叉引用表的位置,通过对交叉引用表的查询可以找到目录对象 (Catalog)。这个目录对象是该 PDF 文档的根对象,包含 PDF 文档的大纲 (outline) 和页面组对象(pages)引用。大纲对象是指 PDF 文件的书签树;页面组对象(pages)包含该文件的页面数,各个页面对象 (page) 的对象号。
1 0 obj
<<
/Type /Catalog
/Pages 3 0 R
/Outlines 2 0 R
>>
endobj
第一行,3 为对象号,来唯一标识一个对象,“0”为产生号,记录创建后的修改次数,obj 对象包含在”«”和“»”中,以 endobj 结尾,Catalog 表明这是一个根对象,“/Pages 3 0 R”表示 pages 的目标对象号为 3 的对象,“3 0 R”表示对对象 3 的引用。
xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000322 00000 n
0000000415 00000 n
0000000445 00000 n
xref 说明一个交叉引用表的开始,“0 8”说明所描述的对象号从 0 开始,一共有 8 个对象。0000000000 65535 f,一般每个 PDF 文件都是以这一行开始交叉应用表的,说明对象 0 的起始地址为 0000000000,产生号(generation number)为 65535,也是最大产生号,不可以再进行更改,而且最后对象的表示是 f, 表明该对象为 free,n 表示对象在使用。
railer
<<
/Size 15
/Root 1 0 R
/Info 3 0 R
/ID [<713426ff2d8242afb682c0773c4e7dea><7bdc95e8c8e1427c83de76efbff959d3>]
>>startxref
22053
%%EOF
/Size
指定交叉引用表中的条目数/Root
说明根对象的对象号/Info
指定文档信息字典的参考对象/ID
指定由两个字节的未加密字符串组成的数组,这些字符串构成文件标识符/XrefStm
交叉引用表在文件中的偏移先将 PDF 文档中的文档元素提取出来,然后再将这些文档元素一个一个的复制到新生成的 Word 文档中,并将原 PDF 文档中的排版信息也引用到 Word 文档中。这样,PDF 文档中的文字,图片,表格,注释等等文档元素就能转换成 Word 文档中相对应的元素。
PDF 恶意代码。
2018 年 5 月 15 日,ESET 发布文章“A tale of two zero-days”,该文章披露了今年 3 月 ESET 在恶意软件扫描引擎(VirusTotal)上捕获了一个用于攻击测试的 PDF 文档。该 PDF 文档样本包含两枚 0-day 漏洞(CVE-2018-4990,CVE-2018-8120)以实现针对 Adobe Acrobat/Reader PDF 阅读器的任意代码执行。其中 CVE-2018-4990 为 Adobe PDF 阅读器的代码执行漏洞,而 CVE-2018-8120 则是 Windows 操作系统 Win32k 的内核提权漏洞,在获取代码执行权限后通过内核提权漏洞绕过 Adobe PDF 阅读器的沙盒保护,实现任意代码执行。
堆喷射是在 shellcode 的前面加上大量的 slide code(跳板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得内存被大量的注入代码占据。然后通过结合其他漏洞控制程序流,使得程序执行到堆上,最终将导致 shellcode 的执行。
在漏洞利用开头阶段,JavaScript 代码开始操控 Button1 对象,该对象包含一个精心构造的 JPEG2000 图像,该图像会触发 Adobe Reader 中的双重释放(double-free)漏洞。
JavaScript 代码中用到了堆喷射(heap-spray)技术以破坏内部数据结构。在这些操作都完成后,攻击者就实现了他们的主要目标:从 JavaScript 代码中实现内存的读取及写入。
攻击者成功定位 EScript.api 插件的内存地址,而该插件正是 Adobe JavaScript 的引擎。利用该模块的汇编指令(ROP gadgets),恶意 JavaScript 成功构造了一条 ROP 链,可以执行本地 shellcode。