CVE-2010-2883_adobe_sof
环境
工具 |
环境 |
操作系统 |
Windows XP SP3 + Windows 10 |
虚拟机 |
VMware 16 pro |
反汇编器 |
IDA pro |
调试器 |
OllyDbg |
漏洞软件 |
Adobe Reader 9.3.4 |
原理
使用IDA反汇编Adobe Reader目录下的CoolType.dll
库,通过Alt+T
搜索字符串SING
;
.text:0803DC6D sub_803DBF2 push offset aSing ; "SING"
|
也可以通过shift+F12
和ctrl+f
来找到该字符串,利用ctrl+x
找到引用该字符串的位置;
.rdata:0819DB4C aSing db 'SING',0 ; DATA XREF: sub_8015A91+D2↑o .rdata:0819DB4C ; sub_803DBF2+7B↑o ...
|
双击进入其所在位置,可以看到如下的汇编内容;
.text:0803DBF2 ; __unwind { // loc_81847C4 .text:0803DBF2 push ebp .text:0803DBF3 sub esp, 104h ; 开辟了0x104bytes的栈空间 .text:0803DBF9 lea ebp, [esp-4] ; 后续调用的strcat会将结果保存在这里 .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] ; 指向SING表入口 .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 ; 相对sing表入口偏移0x10处找到uniqueName .text:0803DC9B push eax ; Source, uniqueName域 .text:0803DC9C lea eax, [ebp+108h+Destination] .text:0803DC9F push eax ; Destination, 一段固定大小的栈空间 .text:0803DCA0 mov [ebp+108h+Destination], 0 .text:0803DCA4 call strcat ; 造成栈溢出
|
由于没有对uniqueName
字段的字符串长度进行检查,如果直接将其复制到固定大小的栈空间将会导致栈溢出;
样本分析
将样本中的TTF文件取出,使用的是PdfStreamDumper
这个工具;