CVE-2010-2883栈溢出漏洞分析及复现
0x00 概述
CVE-2010-2883漏洞已经出来很久了,很多人已经分析复现过了,最近在搞pwn这块,准备把栈溢出弄一下,是adobereader中的一个0day,由于CoolType.dll中堆栈缓冲区溢出错误使攻击者通过pdf中的ttf字体在SING表中具有长字段PDF文档进行转换,当用户安全意识比较低的时候打开了具有恶意代码的pdf文件就有可能造成任意代码执行或拒绝服务。
什么是CoolType.dll?
Cooltype.dll全称是"CoolType Typography Engine",adobe systems的一个动态链接库,属于Cooltype的一部分
0x01 受影响版本
- Windows&Mac&Unix的Adobe Reader9.3.4版本及之前
- Windows&Mac&Unix的Adobe Acroba9.3.4版本及之前
0x02 分析环境
使用环境 | |
---|---|
system | Windows XP Professional SP3 |
调试器 | Olldbg |
反汇编 | IDA Pro |
漏洞版本 | Adobe Reader : 9.3.4 |
0x04 漏洞分析
CoolType.dll,定位到出现漏洞的位置
.text:0803DBF2 push ebp
.text:0803DBF3 sub esp, 104h ; 分配空间
.text:0803DBF9 lea ebp, [esp-4] ; strcat将执行结果保存在ebp中
.text:0803DBFD mov eax, ___security_cookie
.text:0803DC02 xor eax, ebp
.text:0803DC04 mov [ebp+108h+var_4], eax
.text:0803DC0A push 4Ch
.text:0803DC0C mov eax, offset loc_81847C4
.text:0803DC11 call __EH_prolog3_catch
.text:0803DC16 mov eax, [ebp+108h+arg_C]
.text:0803DC1C mov edi, [ebp+108h+arg_0]
.text:0803DC22 mov ebx, [ebp+108h+arg_4]
.text:0803DC28 mov [ebp+108h+var_130], edi
.text:0803DC2B mov [ebp+108h+var_138], eax
.text:0803DC2E call sub_8041626
.text:0803DC33 xor esi, esi
.text:0803DC35 cmp dword ptr [edi+8], 3
.text:0803DC39 ; try {
.text:0803DC39 mov [ebp+108h+var_10C], esi
.text:0803DC3C jz loc_803DDF9
.text:0803DC42 mov [ebp+108h+var_124], esi
.text:0803DC45 mov [ebp+108h+var_120], esi
.text:0803DC48 cmp dword ptr [edi+0Ch], 1
.text:0803DC48 ; } // starts at 803DC39
.text:0803DC4C ; try {
.text:0803DC4C mov byte ptr [ebp+108h+var_10C], 1
.text:0803DC50 jnz loc_803DDA2
.text:0803DC56 push offset aName ; "name"
.text:0803DC5B push edi ; int
.text:0803DC5C lea ecx, [ebp+108h+var_124]
.text:0803DC5F mov [ebp+108h+var_119], 0
.text:0803DC63 call sub_802178F
.text:0803DC68 cmp [ebp+108h+var_124], esi
.text:0803DC6B jnz short loc_803DCD6
.text:0803DC6D push offset aSing ; "SING"
.text:0803DC72 push edi ; int
.text:0803DC73 lea ecx, [ebp+108h+var_12C] ; 指向虚表的指针
.text:0803DC76 call sub_8021ABE ; 处理sing表
.text:0803DC7B mov eax, [ebp+108h+var_12C]
.text:0803DC7E cmp eax, esi ; 判断是否为空
.text:0803DC7E ; } // starts at 803DC4C
.text:0803DC80 ; try {
.text:0803DC80 mov byte ptr [ebp+108h+var_10C], 2
.text:0803DC84 jz short loc_803DCBD ; 不跳转
.text:0803DC86 mov ecx, [eax] ; 版本号
.text:0803DC88 and ecx, 0FFFFh
.text:0803DC8E jz short loc_803DC98 ; 跳转
.text:0803DC90 cmp ecx, 100h
.text:0803DC96 jnz short loc_803DCB9
.text:0803DC98
.text:0803DC98 loc_803DC98: ; CODE XREF: sub_803DBF2+9C↑j
.text:0803DC98 add eax, 10h ; 寻找uniqueName,相对sing表入口偏移0x10
.text:0803DC9B push eax ; char *
.text:0803DC9C lea eax, [ebp+108h+var_108] ; 目的地址是一段固定大小的栈空间,就是前面申请的空间
.text:0803DC9F push eax ; char *
.text:0803DCA0 mov [ebp+108h+var_108], 0
.text:0803DCA4 call strcat ;造成溢出
PdfStreamDumper分析pdf样本
我们可以看到sing数据是0x11C开始的,sing数据长度是0x1DDF,sing从真实数据偏移0x10为uniqueName域,入口偏移0x11c为sing表的真实数据,也就是从00 00 01 00开始的部分偏移0x10就能找到uniqueName域(uniqueName域是个28字节大小的结构),执行strcat后,会将58 E0 8D AD起始的复制到ebp指定的地址中,直到遇到NULL字符串终止符,也就是strcat进行字符串拼接时没有进行长度判断,导致栈溢出
010edit确定偏移位
在线offset 11ch发现
从0x10开始偏移,字段是uniqueName,大小为28字节,以x00结尾
od动态调试
先打开adobe reader,再打开od,attach到adobe reader进程上,f9运行,由于我们刚刚分析到sing地址在0803DC6D被引用,所以在0803DC6D下断点
将带有恶意程序到样本用reader打开,程序就会停在断点上面
我们可以看到ecx是指向0012EB00,到数据窗口查询指针存放到数据
Type | Name | Description |
---|---|---|
Fixed | sfnt version | 65536 (0x0001 0000) for version 1.0 |
USHORT | numTables | Number of tables |
USHORT | searchRange | (Maximum power of 2 ≤numTables)x16 |
USHORT | entrySelector | Log2(Maximum power of 2≤numTables) |
USHORT | rangeShiH | numTablesx 16-searchRange |
我们可以看到在ttf字体文件中,从0字节偏移的位置有一个表目录,这个表目录第一个字段命是sfnt version,用来声明ttf格式版本的,我们看描述可以知道1.0版本的ttf字体文件是以0x00010000来表示版本的,075E3B70处的数数据正好是0x00010000,那么我们就可以判断ecx中保存的是sing的版本好
调用call指令,实际上这个call实际上是处理sing的表,单步,单步
先写到这,擦,睡了狗命要紧