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

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

分析一下MS03043  

2013-05-13 12:30:14|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

分析一下MS03043

Hcper @ 2012.7.30

该漏洞是rpc漏洞,位于接口

[*] Interface:5A7B91F8-FF00-11D0-A9-B2-00-C0-4F-B6-E6-FC 1.0

00:0x768148CA

反汇编msgsvc.dll,来到函数768148CA

 

函数简化如下:

768148CA

|_76812EE9

|_LocalAlloc生成堆空间[1]

|_76814D94使用堆空间[1]

|_LocalFree 释放堆空间[1]

 

这个函数有3个参数,在函数开头下断,查看参数

768148ca 55              push    ebp

0:002> dd esp

0056fb68  786f6ce8 000f31b4 000f31c8 000f31dc

0:002> da 000f31b4 //参数1

000f31b4  "SERVER"

0:002> da 000f31c8 //参数2

000f31c8  "SERVER"

0:002> da 000f31dc//参数3

000f31dc  "11112222333444555"

从上可以看到第三个参数就是数据指针。数据就是来自它所指向的数据。

函数中分配了字符串长度+3大小的堆空间。

在堆空间[1]的生存期间,本函数内的指令以及下层调用对堆空间做了一些操作。

包括对头两个字节存储字符串长度,后面空间存储字符串数据包括最后的零字符。如下图所示。

 

分析一下MS03043 - appall - 且行且记录

 

这儿的堆空间是随输入而动态改变大小,因此没有溢出发生。

 

进入函数76814D94,因为该函数传人了构造的堆空间[1]指针。

76814D94

|_768129FA

|_76812A66

|_LocalAlloc分配堆空间[2],大小11CAh

|_GetLocalTime

|_76814FF6

|_768151A9这儿传人了数据指针

|_76814FF1

|_76814EFD

|_LocalFree释放堆空间[2]

|_76812A66

|_768129FA

 

函数76814D94中开辟了一个固定大小的堆空间,11CA大小。

该函数有4个参数,传人的参数如下:

76814d94 55              push    ebp

0:006> dd esp

0066fb14  76814947 000f2174 000f2188 000fa188

0066fb24  00000000

0:006> da 000f2174 //参数1

000f2174  "SERVER"

0:006> da 000f2188 //参数2

000f2188  "SERVER"

0:006> db 000fa188 l10 //参数3

000fa188  08 00 31 31 32 32 33 33-34 34 00 00 c8 98 4d 00  ..11223344....M.

3个参数就是上层构造的数据。

 

我们的数据写入堆空间[2]是在下层函数768151A9里面,在前面的一些调用中也写入了一些其他信息。你可以dump出该堆空间的信息看看。

 

分析一下MS03043 - appall - 且行且记录

 

进入函数768151A9,该函数如下:

768151A9

|_LocalAlloc分配堆空间[3]

|_76815263

|_LocalFree释放堆空间[3]

 

该函数有4个参数,查看一下。

768151a9 55              push    ebp

0:002> dd esp

0056fadc  76814e25 00000001 000fefca 00000008

0056faec  00000000

0:002> db 000fefca l10

000fefca  31 31 32 32 33 33 34 34-00 00 00 00 00 00 09 00  11223344........

 

该函数中又开辟了一块堆空间[3],大小是两倍字符串大小加一。从下面的可知,该空间主要是临时做转换字符串用,因为有特殊字符0x14会被替换成两个字符0x0D0x0A,再加上字符串结尾零,也就是按极限大小开辟空间的。

所以这个堆空间[3]也不会溢出。

 

该临时串转换完后,会输出到堆空间[2]中,但是有条件,要满足偏移dx<1001h时才会往固定堆空间[2]做输出。

临时串往堆空间[2]输出时,并没有长度方面的限制。

至少我在代码里没看到限制长度的地方。

代码里面只是限制了偏移,这其实没什么作用。因为要限制的是临时串的长度

即(ecx@7681521D)不能超过堆空间[2]的剩余空间即(11CA-dx)。

所以该堆空间有被溢出的可能。

如下图所示。

 

分析一下MS03043 - appall - 且行且记录

 

输出内容方面,如果是特殊字符0x14的话,字符会一变二变长。

 

为了溢出堆空间[2],就要尽量输入足够多的字符。但是明明输入内容的长度是最多885个,如图所示。

 

分析一下MS03043 - appall - 且行且记录

 

这个限制我在代码里却没看到。

但是如果你通过一般的发送程序都是这个值,用NetMessageBufferSend发送也是一样,可能限制是在netbios里面,我对netbios不熟。

 

另一个输入途径就是rpc了,按照MSDN里的说法,当传递字符串指针的时候,rpc会连同指向的数据一起传递给rpc另一端。因为rpc是运行在两个不同的电脑地址空间的,必须传递两者才能不出错。这样的话,我们只要输入足够多的字符,比如2000hA,就可以溢出了,如果输入特殊字符0x14那就更省空间,它会倍增长度的。这个我是用注入法测768148CA处的函数。但用真实的rpc编程法没去实现,因为比较复杂,没去证实。

 

第三种方法,就是模拟rpc的过程发数据包实现了,网上的exploit就是这种。

 

在溢出堆空间[2]的过程中,如果输入数据是限制长度的的话,那偏移值还是有影响的。偏移距离来自76818BCC的字内容。

768151F8  mov     dx, word ptr [76818BCC]

768151FF  cmp     dx, 1001

76815204  jnb     short 7681523E

因此最大dx1000h

 

76815213  movzx   edi, dx

76815216  add     edi, dword ptr [76818BD0]

edi=堆空间[2]+偏移dx

 

76815236  dec     ecx 构造串长

76815237  add     word ptr [76818BCC], cx

 

cdb中调试一下

ba w2 76818bcc "r eip;dw 76818bcc l1;g"

 

发送第一个实例输出

eip=76814e97

76818bcc  0000

eip=768150c7

76818bcc  0025

eip=7681523e

76818bcc  002d

发送另一个实例输出

eip=76814e97

76818bcc  0000

eip=768150c7

76818bcc  0025

eip=7681523e

76818bcc  03a4

 

第一次初始化为零

76814E90  mov     word ptr [76818BCC], si

76814E97  jmp     76814DD5

第二次算偏移,里面包含了机器名的长度,但是机器名长度是有限的,dx最大1000h,通过增加名字长度,好像实现不了。

768150C0  add     word ptr [76818BCC], ax

768150C7  cmp     dword ptr [ebp+8], 1

第三次再算偏移,加上内容长度,这是有可能达到偏移最大值1000h,但是已经在输出到堆空间[2]之后了,已经晚了。

76815237  add     word ptr [76818BCC], cx

7681523E  cmp     dword ptr [ebp+8], 1

 

以上可以看出,输出到堆空间[2]时,偏移值不会太大,也就25h左右。

要造成溢出,输入长度要么大于11A5h才行,要么也可以少于这个数,但是通过特殊字符0x14倍增之后,长度必须大于11A5才行。

 

后面附上相关代码,这些代码我是在cad里面平铺来看,我喜欢中键按住平移,中键滚动缩放。因为现有的编辑器都是文本编辑器,只能做一些行文本的注释。而我不喜欢被束缚在文本行上,我喜欢做一些图线来表示调用关系。做一些示意图也很方便。查看距离比较远的代码也很方便。个人习惯不同。如下图,因为占用屏幕太大,所以我只弄个全局的视图,其实它是可以随时缩放的。

 

分析一下MS03043 - appall - 且行且记录

 

相关代码如下:

 

[+] open file D:\Temp\ida\MSGSVC_2K.DLL

[*] Interface:17FDD703-1827-4E34-79-D4-24-A5-5C-53-BB-37 1.0

00:0x7681312E

01:0x768132DF

02:0x76814407

03:0x76812F0F

 

[*] Interface:5A7B91F8-FF00-11D0-A9-B2-00-C0-4F-B6-E6-FC 1.0

00:0x768148CA

 

反汇编768148CA处的代码

768148CA  /.  55            push    ebp

768148CB  |.  8BEC          mov     ebp, esp

768148CD  |.  53            push    ebx

768148CE  |.  56            push    esi

768148CF  |.  57            push    edi

768148D0  |.  E8 14E6FFFF   call    76812EE9 ;这个调用不用进入,因为没有传入参数

768148D5  |.  83F8 03       cmp     eax, 3

768148D8  |.  74 7C         je      short 76814956

768148DA  |.  83F8 04       cmp     eax, 4

768148DD  |.  74 77         je      short 76814956

768148DF  |.  8B7D 10       mov     edi, dword ptr [ebp+10] ;参数3出现,指针,指向字符串

768148E2  |.  83C9 FF       or      ecx, FFFFFFFF

768148E5  |.  33C0          xor     eax, eax

768148E7  |.  F2:AE         repne   scas byte ptr es:[edi]

768148E9  |.  F7D1          not     ecx

768148EB  |.  49            dec     ecx ;求字符串长度

768148EC  |.  8BF1          mov     esi, ecx

768148EE  |.  8D46 03       lea     eax, dword ptr [esi+3]

768148F1  |.  50            push    eax                                      ; /Size

768148F2  |.  6A 00         push    0                                        ; |Flags = LMEM_FIXED

768148F4  |.  FF15 C4108176 call    dword ptr [<&KERNEL32.LocalAlloc>]     ; \LocalAlloc

768148FA  |.  8BD8          mov     ebx, eax

768148FC  |.  85DB          test    ebx, ebx

768148FE  |.  75 0A         jnz     short 7681490A

76814900  |.  6A 08         push    8

76814902  |.  58            pop     eax

76814903  |>  5F            pop     edi

76814904  |.  5E            pop     esi

76814905  |.  5B            pop     ebx

76814906  |.  5D            pop     ebp

76814907  |.  C2 0C00       retn    0C

7681490A  |>  8B7D 10       mov     edi, dword ptr [ebp+10]

7681490D  |.  83C9 FF       or      ecx, FFFFFFFF

76814910  |.  33C0          xor     eax, eax

76814912  |.  66:8933       mov     word ptr [ebx], si ;写入长度

76814915  |.  F2:AE         repne   scas byte ptr es:[edi]

76814917  |.  F7D1          not     ecx

76814919  |.  2BF9          sub     edi, ecx

7681491B  |.  8D53 02       lea     edx, dword ptr [ebx+2]

7681491E  |.  8BC1          mov     eax, ecx

76814920  |.  8BF7          mov     esi, edi

76814922  |.  8BFA          mov     edi, edx ;长度之后跟着字符串

76814924  |.  C1E9 02       shr     ecx, 2

76814927  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]

76814929  |.  8BC8          mov     ecx, eax

7681492B  |.  83E1 03       and     ecx, 3

7681492E  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]

76814930  |.  833D DC888176>cmp     dword ptr [768188DC], 0

76814937  |.  74 19         je      short 76814952

76814939  |.  6A FF         push    -1

7681493B  |>  53            push    ebx ;上面构造的串,内容

7681493C  |.  FF75 0C       push    dword ptr [ebp+C] ;目的计算机名

7681493F  |.  FF75 08       push    dword ptr [ebp+8] ;来源计算机名

76814942  |.  E8 4D040000   call    76814D94 ;进入这个调用,因为只有这个调用传入了参数

76814947  |.  53            push    ebx                                      ; /hMemory

76814948  |.  FF15 0C118176 call    dword ptr [<&KERNEL32.LocalFree>]        ; \LocalFree

7681494E  |.  33C0          xor     eax, eax

76814950  |.^ EB B1         jmp     short 76814903

76814952  |>  6A 00         push    0

76814954  |.^ EB E5         jmp     short 7681493B

76814956  |>  B8 26040000   mov     eax, 426

7681495B  \.^ EB A6         jmp     short 76814903

 

进入到76814D94

76814D94  /$  55            push    ebp

76814D95  |.  8BEC          mov     ebp, esp

76814D97  |.  83EC 14       sub     esp, 14

76814D9A  |.  53            push    ebx

76814D9B  |.  56            push    esi

76814D9C  |.  57            push    edi

76814D9D  |.  68 48368176   push    76813648                                 ;  ASCII "Msglogsbm"

76814DA2  |.  6A 01         push    1

76814DA4  |.  E8 51DCFFFF   call    768129FA

76814DA9  |.  68 40368176   push    76813640                                 ;  ASCII "logsbm"

76814DAE  |.  6A 02         push    2

76814DB0  |.  E8 B1DCFFFF   call    76812A66

76814DB5  |.  68 CA110000   push    11CA                                     ; /Size = 11CA (4554.) 分配11CA大小

76814DBA  |.  6A 40         push    40                                       ; |Flags = LPTR

76814DBC  |.  FF15 C4108176 call    dword ptr [<&KERNEL32.LocalAlloc>]     ; \LocalAlloc

76814DC2  |.  33F6          xor     esi, esi

76814DC4  |.  A3 D08B8176   mov     dword ptr [76818BD0], eax

76814DC9  |.  3BC6          cmp     eax, esi

76814DCB  |.  0F85 BC000000 jnz     76814E8D

76814DD1  |.  834D FC FF    or      dword ptr [ebp-4], FFFFFFFF

76814DD5  |>  8B5D 10       mov     ebx, dword ptr [ebp+10]

76814DD8  |.  66:8B03       mov     ax, word ptr [ebx] 取输入的大小

76814DDB  |.  43            inc     ebx

76814DDC  |.  66:8945 10    mov     word ptr [ebp+10], ax 输入的大小保存到参数3

76814DE0  |.  8D45 EC       lea     eax, dword ptr [ebp-14]

76814DE3  |.  50            push    eax                                      ; /pLocaltime

76814DE4  |.  43            inc     ebx 指向输入的数据                       ; |

76814DE5  |.  FF15 F0108176 call    dword ptr [<&KERNEL32.GetLocalTime>]   ; \GetLocalTime

76814DEB  |.  3935 A8878176 cmp     dword ptr [768187A8], esi

76814DF1  |.  75 46         jnz     short 76814E39

76814DF3  |.  3975 FC       cmp     dword ptr [ebp-4], esi

76814DF6  |.  75 41         jnz     short 76814E39

76814DF8  |.  56            push    esi

76814DF9  |.  8D75 EC       lea     esi, dword ptr [ebp-14]

76814DFC  |.  83EC 10       sub     esp, 10

76814DFF  |.  8BFC          mov     edi, esp

76814E01  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E02  |.  FF75 0C       push    dword ptr [ebp+C]

76814E05  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E06  |.  FF75 08       push    dword ptr [ebp+8]

76814E09  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E0A  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E0B  |.  6A 01         push    1

76814E0D  |.  5E            pop     esi

76814E0E  |.  56            push    esi

76814E0F  |.  E8 E2010000   call    76814FF6

76814E14  |.  85C0          test    eax, eax

76814E16  |.  75 1D         jnz     short 76814E35

76814E18  |.  50            push    eax

76814E19  |.  0FBF45 10     movsx   eax, word ptr [ebp+10] 输入的大小

76814E1D  |.  50            push    eax

76814E1E  |.  53            push    ebx 指向输入的数据

76814E1F  |.  56            push    esi

76814E20  |.  E8 84030000   call    768151A9

76814E25  |.  85C0          test    eax, eax

76814E27  |.  75 0C         jnz     short 76814E35

76814E29  |.  50            push    eax

76814E2A  |.  56            push    esi

76814E2B  |.  56            push    esi

76814E2C  |.  E8 C0010000   call    76814FF1

76814E31  |.  85C0          test    eax, eax

76814E33  |.  74 04         je      short 76814E39

76814E35  |>  834D FC FF    or      dword ptr [ebp-4], FFFFFFFF

76814E39  |>  837D FC 00    cmp     dword ptr [ebp-4], 0

76814E3D  |.  75 21         jnz     short 76814E60

76814E3F  |.  83EC 10       sub     esp, 10

76814E42  |.  8D75 EC       lea     esi, dword ptr [ebp-14]

76814E45  |.  8BFC          mov     edi, esp

76814E47  |.  66:A1 CC8B817>mov     ax, word ptr [76818BCC]

76814E4D  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E4E  |.  FF75 14       push    dword ptr [ebp+14]

76814E51  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E52  |.  FF35 D08B8176 push    dword ptr [76818BD0]

76814E58  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E59  |.  50            push    eax

76814E5A  |.  A5            movs    dword ptr es:[edi], dword ptr [esi]

76814E5B  |.  E8 9D000000   call    76814EFD

76814E60  |>  FF35 D08B8176 push    dword ptr [76818BD0]                     ; /hMemory = NULL

76814E66  |.  FF15 0C118176 call    dword ptr [<&KERNEL32.LocalFree>]        ; \LocalFree

76814E6C  |.  68 40368176   push    76813640                                 ;  ASCII "logsbm"

76814E71  |.  6A 03         push    3

76814E73  |.  E8 EEDBFFFF   call    76812A66

76814E78  |.  68 48368176   push    76813648                                 ;  ASCII "Msglogsbm"

76814E7D  |.  6A 03         push    3

76814E7F  |.  E8 76DBFFFF   call    768129FA

76814E84  |.  5F            pop     edi

76814E85  |.  5E            pop     esi

76814E86  |.  33C0          xor     eax, eax

76814E88  |.  5B            pop     ebx

76814E89  |.  C9            leave

76814E8A  |.  C2 1000       retn    10

76814E8D  |>  8975 FC       mov     dword ptr [ebp-4], esi

76814E90  |.  66:8935 CC8B8>mov     word ptr [76818BCC], si

76814E97  \.^ E9 39FFFFFF   jmp     76814DD5

 

进入768151A9

768151A9  /$  55            push    ebp

768151AA  |.  8BEC          mov     ebp, esp

768151AC  |.  51            push    ecx

768151AD  |.  53            push    ebx

768151AE  |.  56            push    esi

768151AF  |.  8B75 10       mov     esi, dword ptr [ebp+10] 输入的大小

768151B2  |.  57            push    edi

768151B3  |.  33FF          xor     edi, edi                                 ;  edi=0

768151B5  |.  3BF7          cmp     esi, edi

768151B7  |.  897D FC       mov     dword ptr [ebp-4], edi

768151BA  |.  74 12         je      short 768151CE

768151BC  |.  8D4436 01     lea     eax, dword ptr [esi+esi+1]               ;  2*esi+1

768151C0  |.  50            push    eax                                      ; /Size

768151C1  |.  57            push    edi                                      ; |Flags => LMEM_FIXED

768151C2  |.  FF15 C4108176 call    dword ptr [<&KERNEL32.LocalAlloc>]     ; \LocalAlloc

768151C8  |.  8BD8          mov     ebx, eax                               ;  ebx=alloc[2*esi+1]

768151CA  |.  3BDF          cmp     ebx, edi

768151CC  |.  75 0A         jnz     short 768151D8

768151CE  |>  6A 01         push    1

768151D0  |.  58            pop     eax

768151D1  |>  5F            pop     edi

768151D2  |.  5E            pop     esi

768151D3  |.  5B            pop     ebx

768151D4  |.  C9            leave

768151D5  |.  C2 1000       retn    10

768151D8  |>  8B55 0C       mov     edx, dword ptr [ebp+C] 输入的数据

768151DB  |.  8BC3          mov     eax, ebx 存储构造串

768151DD  |>  8A0A          mov     cl, byte ptr [edx]

768151DF  |.  80F9 14       cmp     cl, 14

768151E2  |.  75 7B         jnz     short 7681525F

768151E4  |.  C600 0D       mov     byte ptr [eax], 0D

768151E7  |.  40            inc     eax

768151E8  |.  C600 0A       mov     byte ptr [eax], 0A

768151EB  |>  40            inc     eax

768151EC  |.  42            inc     edx

768151ED  |.  4E            dec     esi

768151EE  |.^ 75 ED         jnz     short 768151DD

768151F0  |.  8020 00       and     byte ptr [eax], 0

768151F3  |.  397D 08       cmp     dword ptr [ebp+8], edi

768151F6  |.  7C 46         jl      short 7681523E

768151F8  |.  66:8B15 CC8B8>mov     dx, word ptr [76818BCC]

768151FF  |.  66:81FA 0110  cmp     dx, 1001

76815204  |.  73 38         jnb     short 7681523E

76815206  |.  8BFB          mov     edi, ebx

76815208  |.  83C9 FF       or      ecx, FFFFFFFF

7681520B  |.  33C0          xor     eax, eax

7681520D  |.  8BF3          mov     esi, ebx

7681520F  |.  F2:AE         repne   scas byte ptr es:[edi]

76815211  |.  F7D1          not     ecx

76815213  |.  0FB7FA        movzx   edi, dx

76815216  |.  033D D08B8176 add     edi, dword ptr [76818BD0] 计算位置

7681521C  |.  49            dec     ecx 构造串长

7681521D  |.  8BC1          mov     eax, ecx

7681521F  |.  C1E9 02       shr     ecx, 2

76815222  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi] 复制构造串

76815224  |.  8BC8          mov     ecx, eax

76815226  |.  33C0          xor     eax, eax

76815228  |.  83E1 03       and     ecx, 3

7681522B  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]

7681522D  |.  8BFB          mov     edi, ebx

7681522F  |.  83C9 FF       or      ecx, FFFFFFFF

76815232  |.  F2:AE         repne   scas byte ptr es:[edi]

76815234  |.  F7D1          not     ecx

76815236  |.  49            dec     ecx 构造串长

76815237  |.  66:010D CC8B8>add     word ptr [76818BCC], cx

7681523E  |>  837D 08 01    cmp     dword ptr [ebp+8], 1

76815242  |.  7D 0C         jge     short 76815250

76815244  |.  FF75 14       push    dword ptr [ebp+14]

76815247  |.  53            push    ebx

76815248  |.  E8 16000000   call    76815263

7681524D  |.  8945 FC       mov     dword ptr [ebp-4], eax

76815250  |>  53            push    ebx                                      ; /hMemory

76815251  |.  FF15 0C118176 call    dword ptr [<&KERNEL32.LocalFree>]      ; \LocalFree

76815257  |.  8B45 FC       mov     eax, dword ptr [ebp-4]

7681525A  |.^ E9 72FFFFFF   jmp     768151D1

7681525F  |>  8808          mov     byte ptr [eax], cl

76815261  \.^ EB 88         jmp     short 768151EB

 

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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