CVE-2010-2883栈溢出漏洞分析及复现

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,到数据窗口查询指针存放到数据
10

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的表,单步,单步




先写到这,擦,睡了狗命要紧

1赞

服务器资源由ZeptoVM赞助

Partners Wiki IRC