实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 | |
虚拟机 | Vmware | |
调试器 | Windbg | |
反汇编器 | IDA Pro | |
漏洞软件 | Adobe Read | 9.5.0 |
漏洞描述
Adobe Reader 和 9.5.1 之前的 Acrobat 9.x 以及 10.1.3 之前的 10.x 中的整数溢出允许攻击者通过精心设计的 TrueType 字体执行任意代码。
PDF文件格式和常用分析工具
Didier Steven的PDF-tools
python2 make-pdf-javascript.py test.py
上述命令生成一个会弹窗的pdf文件。
notepad++打开该文件。
%PDF-1.1 # PDF文件头,符合PDF1.1规范
1 0 obj #Object对象,1为Object的索引Index,0为Object的版本号Version
<< # Object数据开始标记
/Type /Catalog # 字典元素 /Type代表键名 /Catalog代表键值 本对象为Catalog目录类型
/Outlines 2 0 R # Outlines(大纲)对象代表PDF文件的书签树,它间接引用Object 2
/Pages 3 0 R # Pages(页面组)对象包含文件的页面数,它间接引用Object 3
/OpenAction 7 0 R # 打开文档后自动执行的动作,这里执行Javascript代码,间接引用Object 7
>> # Object数据结束标记
endobj #Object结束关键字
2 0 obj
<<
/Type /Outlines # 对象类型为Outlines
/Count 0 # 书签计数为0
>>
endobj
3 0 obj
<<
/Type /Pages # 对象类型为Pages
/Kids [4 0 R] # 代表PDF第一页引用对象4
/Count 1 # 页数
>>
endobj
4 0 obj
<<
/Type /Page
/Parent 3 0 R # 父对象为Object 3
/MediaBox [0 0 612 792] # 页面的显示大小(以像素为单位)
/Contents 5 0 R # 页面内容为对象5
/Resources << # 该页包含的资源
/ProcSet [/PDF /Text] # PDF包含文本内容
/Font << /F1 6 0 R >> # 字体类型为F1,引用对象6
>>
>>
endobj
5 0 obj
<< /Length 56 >> # 页面内容长度为56
stream # 流对象的开始标记
BT #文字对象的开始标记# /F1 12 Tf 100 700 Td 15 TL (JavaScript example) Tj ET #文字对象的开始标记#
endstream # 流对象的结束标记
endobj
6 0 obj
<<
/Type /Font # 字体对象类型
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /MacRomanEncoding
>>
endobj
7 0 obj
<<
/Type /Action # 动作对象
/S /JavaScript # 内嵌Javascript脚本
/JS (app.alert({cMsg: 'Hello from PDF JavaScript', cTitle: 'Testing PDF JavaScript', nIcon: 3});) # 执行aler弹窗,内容为cMsg中的内容
>>
endobj
xref # 交叉引用表
0 8 # 对象号从0开始,共有8个对象
0000000000 65535 f # 对象1 生成号65535代表对象重复用,f代表自由对象
0000000010 00000 n # 对象2 10代表偏移量,0代表该对象违背修改过,n代表对象正在使用
0000000098 00000 n
0000000147 00000 n
0000000208 00000 n
0000000400 00000 n
0000000507 00000 n
0000000621 00000 n
trailer # 文件尾对象
<<
/Size 8 # 对象数目
/Root 1 0 R # 根对象为Object 1
>>
startxref # 交叉引用表在文件流偏移773处
773
%%EOF # 文件结束标志
010editor查看该文件。
PDFStreamDumper打开该文件。
静态分析
书中提及的TrueType Font Analyzer可以追溯到这个网页http://jikasei.me/font/rounded-mplus/memo.html,但是没看到下载链接。
使用010editor打开ttf文件会出现如图警告。
点击警告会跳转到结构体tcmp_format4中。
搜索tcmap_format4会跳转到tcmap结构体中。
由于第二个record的length是64,(length-(FTell()-cmap_subtable))/2 == 0
glyf主要用于保存操作堆栈的虚拟指令,即图元指令。TrueType图元指令是一个伪计算机字节指令,类似于Java的虚拟机指令。TTF中的glyf表主要用于存放图元轮廓定义以及网格调整指令,其位置索引是一张单独的表,而图元数据表主要记录图元的索引号Index(这段话还是挺难理解的,建议直接去看文档)。
使用windbg附加进程打开poc,发现中断处。coolType+0x7a1c
IDA反编译dll,查看伪代码如下。
OD设下条件断点打印虚拟指令索引号。
触发虚拟指令索引号为0x26为MINDEX处理函数。
动态调试。i=0x40000001,i*4整数溢出,所以导致i控制换导致超出了v4的空间。
更多的分析是ttf虚拟指令的分析,这里不多做了。
补丁分析
这里的补丁无法分析,由于漏洞函数和修复后的函数在bindiff中无法匹配。
文章评论