CVE-2013-3906简要分析


CVE-2013-3906简要分析

简单分析了一下做个笔记,有错误之处望指正。

漏洞成因

         Word在处理TIFF文件格式的时候一个整数溢出导致了堆溢出,覆盖了函数指针,导致任意代码执行。

TIFF格式

TIFF格式中靠图像文件目录IFD来表示各个字段,IFD有很多类型,其中一个叫StripByteCounts(标号0x117),官方的解释它是For each strip, the number of bytes in the strip after compression.就是一些压缩后的长度数组,结果WORD把这些长度简单相加导致了整数溢出。

代码分析

C:\Program Files (x86)\CommonFiles\microsoft shared\OFFICE12\OGL.DLL

3BDC576D    55              push    ebp

3BDC576E    8BEC            mov     ebp, esp

3BDC5770    0FB78F EC000000 movzx   ecx, word ptr [edi+EC]

3BDC5777    33C0            xor     eax, eax

3BDC5779    85C9            test    ecx, ecx

3BDC577B    56              push    esi

3BDC577C    7E 15           jle     short 3BDC5793

3BDC577E    8B97 A0000000   mov    edx, dword ptr [edi+A0]  ;StripByteCountsfile offset 0x3324

3BDC5784    0FB7B7 EC000000 movzx   esi, word ptr [edi+EC]

3BDC578B    0302            add     eax, dword ptr [edx]   ;共0x44个DWORD相加,第一个是FFFFB898,整数溢出了

3BDC578D    83C2 04        add     edx, 4

3BDC5790    4E              dec     esi

3BDC5791  ^ 75 F8           jnz     short 3BDC578B

3BDC5793    8B75 0C         mov    esi, dword ptr [ebp+C]

3BDC5796    8D4448 08       lea    eax, dword ptr [eax+ecx*2+8]

3BDC579A    03C6           add     eax, esi        ;加上0x1484(JPEGInterchangeFormatLength)之后长度正好溢出为0

3BDC579C    50              push    eax

3BDC579D    8987 60010000   mov    dword ptr [edi+160], eax

3BDC57A3    E8 B0CCF4FF     call   3BD12458          ;分配0字节heap

3BDC57A8    85C0           test    eax, eax

3BDC57AA    8987 64010000   mov    dword ptr [edi+164], eax

3BDC57B0    75 08           jnz     short 3BDC57BA

3BDC57B2    83C8 FF         or     eax, FFFFFFFF

3BDC57B5    5E              pop     esi

3BDC57B6    5D              pop     ebp

3BDC57B7    C2 0800         retn   8

3BDC57BA    8B4D 08         mov    ecx, dword ptr [ebp+8]

3BDC57BD    53              push    ebx

3BDC57BE    FFB7 08010000   push   dword ptr [edi+108]

3BDC57C4    56              push    esi

3BDC57C5    E8 12C30500     call   3BE21ADC

3BDC57CA    8BD8            mov     ebx, eax

3BDC57CC    85DB            test    ebx, ebx

3BDC57CE    0F8C BC000000   jl     3BDC5890

3BDC57D4    FF75 0C         push   dword ptr [ebp+C]

3BDC57D7    8BB7 64010000   mov    esi, dword ptr [edi+164]

3BDC57DD    FF75 08         push   dword ptr [ebp+8]

3BDC57E0    56              push    esi

3BDC57E1    E8 B5D4F4FF     call   <jmp.&MSVCR80.memcpy> ;把0x1484字节拷贝到刚分配的0字节heap

这里复制的是JPEGInterchangeFormat

 

3BDC57E6    0375 0C        add     esi, dword ptr [ebp+C]

3BDC57E9    83C4 0C         add    esp, 0C

3BDC57EC    C606 FF         mov    byte ptr [esi], 0FF

3BDC57EF    46              inc     esi

3BDC57F0    C606 DD         mov    byte ptr [esi], 0DD

3BDC57F3    46             inc     esi

3BDC57F4    C606 00         mov    byte ptr [esi], 0

3BDC57F7    46              inc     esi

3BDC57F8    C606 04         mov    byte ptr [esi], 4

3BDC57FB    46              inc     esi

3BDC57FC    8BC3            mov     eax, ebx

3BDC57FE    C1F8 08         sar    eax, 8

3BDC5801    8806            mov     byte ptr [esi], al

3BDC5803    46              inc     esi

3BDC5804    881E            mov     byte ptr [esi], bl

3BDC5806    33DB            xor     ebx, ebx

3BDC5808    46              inc    esi

3BDC5809    66:399F EC00000>cmp     word ptr [edi+EC], bx

3BDC5810    76 5E           jbe     short 3BDC5870

3BDC5812    8B87 9C000000   mov    eax, dword ptr [edi+9C]

3BDC5818    8B0498          mov     eax, dword ptr [eax+ebx*4]

3BDC581B    8B8FA0000000   mov     ecx, dword ptr [edi+A0]

3BDC5821    8B0C99          mov     ecx, dword ptr [ecx+ebx*4]

3BDC5824    50              push    eax

3BDC5825    57              push    edi

3BDC5826    894D 0C         mov    dword ptr [ebp+C], ecx

3BDC5829    E8 3DAA0500     call   3BE2026B

3BDC582E    85C0            test    eax, eax

3BDC5830    75 5E           jnz     short 3BDC5890

3BDC5832    FF75 0C         push   dword ptr [ebp+C]

3BDC5835    56              push    esi

3BDC5836    57             push    edi

3BDC5837    E8 2F0DFDFF     call   3BD9656B

3BDC583C    85C0            test    eax, eax

3BDC583E    75 50           jnz     short 3BDC5890

3BDC5840    0375 0C         add    esi, dword ptr [ebp+C]

3BDC5843    8BC3            mov     eax, ebx

3BDC5845    25 07000080     and    eax, 80000007

3BDC584A    79 05           jns     short 3BDC5851

3BDC584C    48              dec     eax

3BDC584D    83C8 F8         or     eax, FFFFFFF8

3BDC5850    40              inc     eax

3BDC5851    0FB70445 8058DC>movzx   eax, word ptr [eax*2+3BDC5880]

 

调用到这里

3BE2026B    55              push    ebp

3BE2026C    8BEC            mov     ebp, esp

3BE2026E    8B45 08         mov    eax, dword ptr [ebp+8]

3BE20271    8D88 58010000   lea    ecx, dword ptr [eax+158]

3BE20277    51              push    ecx

3BE20278    6A 00           push    0

3BE2027A    FF75 0C         push   dword ptr [ebp+C]

3BE2027D    FF30            push    dword ptr [eax]

3BE2027F>  FF50 20         call   dword ptr [eax+20] ;0x08080808   恰好覆盖了函数指针

3BE20282    83C4 10         add    esp, 10

3BE20285    85C0            test    eax, eax

3BE20287    7D 07           jge     short 3BE20290

3BE20289    6A 0C           push    0C

3BE2028B    58              pop     eax

3BE2028C    5D              pop    ebp

3BE2028D    C2 0800         retn   8

一般堆溢出要想利用也是很不容易的,但是这里凑巧覆盖了函数指针。

HeapSpray

利用activex来进行heapspray控制内存布局是个不错的办法,但是目前看还是对系统性能有一定要求的,在某些系统上还没分配好内存但是已经跳过去执行了。

Shellcode

我手里这个样本的shellcode真心不怎么样啊,除了对API进行了校验以外,基本没什么亮点。关键问题是,WORD漏洞用download&exec shellcode,这不符合我天朝黑客的审美习惯。

这里是调用API之前进行的校验,这种方法能否逃避自动化分析工具,我觉得还要打一个问号。

08080988   8038 E8         cmp     byte ptr [eax], 0E8

0808098B   74 0F           je      short 0808099C

0808098D   8038 E9         cmp     byte ptr [eax], 0E9

08080990   74 0A           je     short 0808099C

08080992   8038 CC         cmp     byte ptr [eax], 0CC

08080995   74 05           je      short 0808099C

08080997   8038 EB         cmp     byte ptr [eax], 0EB

0808099A   75 11           jnz     short 080809AD

0808099C   8178 05 9090909>cmp     dword ptr [eax+5], 90909090

080809A3   74 08           je      short 080809AD

总结

这个漏洞根源还是没有对用户数据做足够的检查,导致了整数溢出。我看这个漏洞特别眼熟之处是恰好前段时间分析的另一个漏洞也是图片格式里面的长度数组累计相加导致溢出。这种漏洞用fuzzer挖掘出来的概率很大,但fuzz的最关键问题还是文件格式,以前也在别的软件里fuzz过TIFF格式,但是由于文档不全,始终无法覆盖所有数据类型,通过对这个漏洞的学习我觉得还可以再fuzz一遍。另外一个值得注意的地方是控制内存布局方法的研究,现在这个已经成了客户端漏洞利用的重中之重了,总把眼光集中到靠脚本heapspray太狭隘了,应该还有更多的方法可以去研究。

参考附录

TIFF文件格式:http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值