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+F12ctrl+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这个工具;