好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 riusksk 于 2011-12-4 13:40 编辑
【标题】:CVE-2010-2883漏洞分析与修复【作者】:riusksk(泉哥)
【主页】:http://riusksk.blogbus.com
【时间】:2011年10月3日
漏洞描述
Adobe Reader的CoolType.dll库在解析字体文件SING表格中的uniqueName项时存在栈溢出漏洞,用户受骗打开了特制的PDF文件就可能导致执行任意代码。目前这个漏洞正在被多个恶意软件积极的用于挂马攻击。
漏洞分析
用IDA反汇编CoolType.dll库,查看字符串可发现“SING”字体,直接定位进去即可查看到该库对sing表格的解析方式,主要是strcat造成的溢出漏洞:
.text:0803DCF9 push ebp
.text:0803DCFA sub esp, 104h ; 分配栈空间0x104
.text:0803DD00 lea ebp, [esp-4] ; 后面的strcat会把执行结果保存在ebp中
.text:0803DD04 mov eax, dword_8230FB8
.text:0803DD09 xor eax, ebp
.text:0803DD0B mov [ebp+104h], eax
.text:0803DD11 push 4Ch
.text:0803DD13 mov eax, offset loc_8184A54
.text:0803DD18 call __EH_prolog3_catch
.text:0803DD1D mov eax, [ebp+arg_C]
.text:0803DD23 mov edi, [ebp+arg_0]
.text:0803DD29 mov ebx, [ebp+arg_4]
.text:0803DD2F mov [ebp+var_28], edi
.text:0803DD32 mov [ebp+var_30], eax
.text:0803DD35 call sub_804172C
.text:0803DD3A xor esi, esi
.text:0803DD3C cmp dword ptr [edi+8], 3
.text:0803DD40 mov [ebp+var_4], esi
.text:0803DD43 jz loc_803DF00
.text:0803DD49 mov [ebp+var_1C], esi
.text:0803DD4C mov [ebp+var_18], esi
.text:0803DD4F cmp dword ptr [edi+0Ch], 1
.text:0803DD53 mov byte ptr [ebp+var_4], 1
.text:0803DD57 jnz loc_803DEA9
.text:0803DD5D push offset aName ; "name"
.text:0803DD62 push edi
.text:0803DD63 lea ecx, [ebp+var_1C]
.text:0803DD66 mov [ebp+var_11], 0
.text:0803DD6A call sub_80217D7
.text:0803DD6F cmp [ebp+var_1C], esi
.text:0803DD72 jnz short loc_803DDDD
.text:0803DD74 push offset aSing ; "SING"
.text:0803DD79 push edi
.text:0803DD7A lea ecx, [ebp+var_24] ; 指向sing表入口
.text:0803DD7D call sub_8021B06 ; 处理SING表
.text:0803DD82 mov eax, [ebp+var_24]
.text:0803DD85 cmp eax, esi ; 判断是否为空
.text:0803DD87 mov byte ptr [ebp+var_4], 2
.text:0803DD8B jz short loc_803DDC4 ; 这里不跳转
.text:0803DD8D mov ecx, [eax] ; 字体资源版本号,这里为1.0版本,即00 10 00 00
.text:0803DD8F and ecx, 0FFFFh
.text:0803DD95 jz short loc_803DD9F ; 这里跳转
.text:0803DD97 cmp ecx, 100h
.text:0803DD9D jnz short loc_803DDC0
.text:0803DD9F
.text:0803DD9F loc_803DD9F: ; CODE XREF: sub_803DCF9+9Cj
.text:0803DD9F add eax, 10h ; 相对sing表入口偏移0x10处找到uniqueName
.text:0803DDA2 push eax ; uniqueName域
.text:0803DDA3 lea eax, [ebp+0]
.text:0803DDA6 push eax ; 目的地址是一段固定大小的栈空间
.text:0803DDA7 mov byte ptr [ebp+0], 0
.text:0803DDAB call strcat ; 造成溢出!!!
漏洞修复
官方在修补该漏洞时,添加对字符串长度的检测与限制,这里它用sub_813391E函数代替了原来的strcat函数:
跟进sub_813391E函数:
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|