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

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

MS02039分析  

2013-08-06 10:32:04|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

MS02039分析

Hcper @ 201385星期一

 

MSSQL2000(<SP3)UDP1434口有溢出,我的是MSSQL2000SP0,所以有这个漏洞。

先下断点bm ws2_32!*recvfrom*断点,还没发数据就断下了,而且还不停的断下。

00 26c8fb40 74fd1053 WS2_32!WSARecvFrom

01 26c8fb74 42cfa52c WSOCK32!recvfrom+0x37

02 26c8fb9c 42cfa025 SSNETLIB!ConnectionPreLogin+0x374f

那就看看42cfa52c附近代码。

SSNETLIB!ConnectionPreLogin+0x3732:

42cfa50f push    offset SSNETLIB!ConnectionPreLogin+0xa743 (42d01520)

42cfa514 push    0

42cfa516 push    400h

42cfa51b mov     ecx,dword ptr [ebp+8]?这个接收缓冲区

42cfa51e push    ecx

42cfa51f mov     edx,dword ptr [SSNETLIB!ConnectionPreLogin+0xa3ff (42d011dc)]

42cfa525 push    edx

42cfa526 call    dword ptr [SSNETLIB!ConnectionPreLogin+0x738f (42cfe16c)];【recvfrom

42cfa52c mov     dword ptr [ebp-8],eax

42cfa52f cmp     dword ptr [ebp-8],0FFFFFFFFh

42cfa533 jne     SSNETLIB!ConnectionPreLogin+0x378f (42cfa56c)

42cfa535 call    dword ptr [SSNETLIB!ConnectionPreLogin+0x73b3 (42cfe190)]

42cfa53b mov     dword ptr [ebp-8],eax

42cfa53e cmp     dword ptr [ebp-8],274Ch

42cfa545 jne     SSNETLIB!ConnectionPreLogin+0x3788 (42cfa565)

42cfa547 cmp     dword ptr [SSNETLIB!ConnectionPreLogin+0xa76f (42d0154c)],0

发现收到数据时会跳到42cfa56c,所以重新再那下个断点bp 42cfa56c这样就不会不停的断。

之后用ncudp过去,断下后在调试器里改首字节为04就可以了。

改好后就可以跟踪这个数据随后的处理了!

 

为了方便分析我用OD单独加载了SSNETLIB.dll这个模块,OD的汇编比windbg直观。

42CF9FF6   >>mov     eax, 1

42CF9FFB   .>test    eax, eax

42CF9FFD   .>je      42CFA225

42CFA003   .>push    400                              ; /n = 400 (1024.)

42CFA008   .>push    0                                ; |c = 00

42CFA00A   .>lea     ecx, dword ptr [ebp-404]             ; |

42CFA010   .>push    ecx                              ; |s

42CFA011   .>call    <jmp.&MSVCRT.memset>            ; \memset

42CFA016   .>add     esp, 0C

42CFA019   .>lea     edx, dword ptr [ebp-404] ?接收缓冲区400h

42CFA01F   .>push    edx

42CFA020   .>call    42CFA4FE?这里面接收数据,返回首字节数据

42CFA025   .>add     esp, 4

42CFA028   .>mov     dword ptr [ebp-4], eax

42CFA02B   >>mov     eax, dword ptr [ebp-4]

42CFA02E   .>mov     dword ptr [ebp-40C], eax

42CFA034   .>cmp     dword ptr [ebp-40C], 9

42CFA03B   .>jg      short 42CFA06B ;首字节大于942CFA06B

42CFA03D   .>cmp     dword ptr [ebp-40C], 9

42CFA044   .>je      short 42CFA0BB ;首字节等于942CFA0BB

42CFA046   .>mov     ecx, dword ptr [ebp-40C]

42CFA04C   .>sub     ecx, 2 ;减2

42CFA04F   .>mov     dword ptr [ebp-40C], ecx

42CFA055   .>cmp     dword ptr [ebp-40C], 6 ;减2后与6比较

42CFA05C   .>ja      short 42CFA0DB ;首字节大于842CFA0DB

42CFA05E   .>mov     edx, dword ptr [ebp-40C]

42CFA064   .>jmp     dword ptr [edx*4+42CFA23B] ;其余往这跳,见下面表

。。。。。。

42CFA091   >>lea     eax, dword ptr [ebp-403] ;我们的数据指针

42CFA097   .>push    eax

42CFA098   .>call    42CFAC6F;进入这个函数

42CFA09D   .>add     esp, 4

。。。。。。

42CFA23B   .>dd      SSnetlib.42CFA082  ;  分支表 被用于 42CFA064

42CFA23F   .>dd      SSnetlib.42CFA082

42CFA243   .>dd      SSnetlib.42CFA091?首字节04对应这个

42CFA247   .>dd      SSnetlib.42CFA0DB

42CFA24B   .>dd      SSnetlib.42CFA0DB

42CFA24F   .>dd      SSnetlib.42CFA0DB

42CFA253   .>dd      SSnetlib.42CFA0A5

 

来到42CFAC6F

42CFAC6F  /$>push    ebp

42CFAC70  |.>mov     ebp, esp

42CFAC72  |.>mov     eax, 1FB4

42CFAC77  |.>call    42CFD740

42CFAC7C  |.>lea     eax, dword ptr [ebp-1FA4]

42CFAC82  |.>mov     dword ptr [ebp-1FA8], eax

42CFAC88  |.>mov     ecx, dword ptr [ebp-1FA8]

42CFAC8E  |.>add     ecx, 3

42CFAC91  |.>mov     dword ptr [ebp-1FAC], ecx

42CFAC97  |.>mov     dword ptr [ebp-1FB4], 0

42CFACA1  |.>mov     edx, dword ptr [ebp-1FA8]

42CFACA7  |.>mov     byte ptr [edx], 5

42CFACAA  |.>lea     eax, dword ptr [ebp-1FB0]

42CFACB0  |.>push    eax

42CFACB1  |.>lea     ecx, dword ptr [ebp-1FB4]

42CFACB7  |.>push    ecx

42CFACB8  |.>mov     edx, dword ptr [ebp-1FAC]

42CFACBE  |.>push    edx

42CFACBF  |.>mov     eax, dword ptr [ebp+8] ;这里唯一的地方引用我们的数据!

42CFACC2  |.>push    eax

42CFACC3  |.>call    42CFB392 ;进入该函数

42CFACC8  |.>add     esp, 10

 

来到42CFB392这个函数非常长。

42CFB392  /$>push    ebp

42CFB393  |.>mov     ebp, esp

42CFB395  |.>mov     eax, 2914

42CFB39A  |.>call    42CFD740 ;开堆栈

42CFB39F  |.>mov     dword ptr [ebp-2500], 0

42CFB3A9  |.>mov     dword ptr [ebp-2504], 0

42CFB3B3  |.>mov     dword ptr [ebp-88], 0

42CFB3BD  |.>mov     dword ptr [ebp-24C4], 0

42CFB3C7  |.>mov     dword ptr [ebp-290], 0

42CFB3D1  |.>mov     dword ptr [ebp-518], 0

42CFB3DB  |.>mov     eax, dword ptr [ebp+10]

42CFB3DE  |.>mov     dword ptr [eax], 0

42CFB3E4  |.>mov     ecx, dword ptr [ebp+14]

42CFB3E7  |.>mov     dword ptr [ecx], 0

42CFB3ED  |.>cmp     dword ptr [ebp+8], 0 ;是否空指针

42CFB3F1  |.>je      short 42CFB40C

42CFB3F3  |.>push    42D01200                         ; /s2 = ""

42CFB3F8  |.>mov     edx, dword ptr [ebp+8]           ; |

42CFB3FB  |.>push    edx                              ; |s1

42CFB3FC  |.>call    <jmp.&MSVCRT.strcmp>             ; \strcmp ;是否空串

42CFB401  |.>add     esp, 8

42CFB404  |.>test    eax, eax

42CFB406  |.>jnz     42CFB4CC ;这里跳走!

。。。。。。

42CFB4CC  |>>push    1

42CFB4CE  |.>mov     edx, dword ptr [ebp+8]

42CFB4D1  |.>push    edx                              ; /s

42CFB4D2  |.>call    <jmp.&MSVCRT.strlen>             ; \strlen

42CFB4D7  |.>add     esp, 4

42CFB4DA  |.>add     eax, 2 ;求长度并加2

42CFB4DD  |.>push    eax                              ; |nitems

42CFB4DE  |.>call    dword ptr [<&MSVCRT.calloc>]     ; \calloc ;分配堆空间

42CFB4E4  |.>add     esp, 8

42CFB4E7  |.>mov     dword ptr [ebp-2504], eax ;堆空间指针变量

42CFB4ED  |.>cmp     dword ptr [ebp-2504], 0

42CFB4F4  |.>jnz     short 42CFB4FB ;跳转

42CFB4F6  |.>jmp     42CFC13B

42CFB4FB  |>>mov     eax, dword ptr [ebp+8]

42CFB4FE  |.>push    eax  ; /src

42CFB4FF  |.>mov     ecx, dword ptr [ebp-2504]

42CFB505  |.>push    ecx  ; |dest

42CFB506  |.>call    <jmp.&MSVCRT.strcpy> ; \strcpy ;复制到堆空间,不会溢出

42CFB50B  |.>add     esp, 8

42CFB50E  |>>mov     edx, dword ptr [ebp-2504]

42CFB514  |.>mov     dword ptr [ebp-24C8], edx

42CFB51A  |>>/push    42D01204  ; /s2 = ""

42CFB51F  |.>|mov     eax, dword ptr [ebp-24C8] ; |

42CFB525  |.>|push    eax  ; |s1

42CFB526  |.>|call    <jmp.&MSVCRT.strcmp> ; \strcmp ;是空串吗?

42CFB52B  |.>|add     esp, 8

42CFB52E  |.>|test    eax, eax

42CFB530  |.>|je      42CFC107

42CFB536  |.>|mov     dword ptr [ebp-2908], 0

42CFB540  |.>|mov     ecx, dword ptr [ebp+10]

42CFB543  |.>|mov     edx, dword ptr [ecx]

42CFB545  |.>|mov     dword ptr [ebp-290C], edx

42CFB54B  |.>|push    42D00A78                   ; /mssqlserver

42CFB550  |.>|mov     eax, dword ptr [ebp-24C8]       ; |

42CFB556  |.>|push    eax                             ; |s1

42CFB557  |.>|call    dword ptr [<&MSVCRT._stricmp>]  ; \_stricmp

42CFB55D  |.>|add     esp, 8

42CFB560  |.>|test    eax, eax

42CFB562  |.>|jnz     short 42CFB58E ;不是MSSQLServer跳转

42CFB564|.>|push 42D00A84 ; /software\microsoft\mssqlserver\mssqlserver\supersocketnetlib\

42CFB569  |.>|lea     ecx, dword ptr [ebp-2904]       ; |

42CFB56F  |.>|push    ecx                             ; |dest

42CFB570  |.>|call    <jmp.&MSVCRT.strcpy>            ; \strcpy

42CFB575  |.>|add     esp, 8

42CFB578  |.>|push 42D00AC4 ; /software\microsoft\mssqlserver\mssqlserver\currentversion

42CFB57D  |.>|lea     edx, dword ptr [ebp-84]         ; |

42CFB583  |.>|push    edx                             ; |dest

42CFB584  |.>|call    <jmp.&MSVCRT.strcpy>            ; \strcpy

42CFB589  |.>|add     esp, 8

42CFB58C  |.>|jmp     short 42CFB5D0

42CFB58E  |>>|mov     eax, dword ptr [ebp-24C8]

42CFB594  |.>|push    eax ; /<%s>

42CFB595  |.>|push    42D00B00  ; |software\microsoft\microsoft sql server\

42CFB59A  |.>|push    42D00B2C ; |%s%s\mssqlserver\supersocketnetlib\

42CFB59F  |.>|lea     ecx, dword ptr [ebp-2904]       ; |

42CFB5A5  |.>|push    ecx  ; |s

42CFB5A6  |.>|call    dword ptr [<&MSVCRT.sprintf>] ; \sprintf

;这里堆栈空间2094h很大,不会溢出

42CFB5AC  |.>|add     esp, 10

42CFB5AF  |.>|mov     edx, dword ptr [ebp-24C8]?我们的输入数据400h-2

42CFB5B5  |.>|push    edx  ; /<%s>

42CFB5B6  |.>|push    42D00B50 ; |software\microsoft\microsoft sql server\

42CFB5BB  |.>|push    42D00B7C ; |%s%s\mssqlserver\currentversion

42CFB5C0  |.>|lea     eax, dword ptr [ebp-84]         ; |

42CFB5C6  |.>|push    eax                             ; |s

42CFB5C7  |.>|call    dword ptr [<&MSVCRT.sprintf>]   ; \sprintf

;这里堆栈空间84h很小,输入数据400h-2,加上其他串就更大,有溢出!!

42CFB5CD  |.>|add     esp, 10

42CFB5D0  |>>|lea     ecx, dword ptr [ebp-2500]

42CFB5D6  |.>|push    ecx                             ; /pHandle

42CFB5D7  |.>|push    20019                           ; |Access = KEY_READ

42CFB5DC  |.>|push    0                               ; |Reserved = 0

42CFB5DE  |.>|lea     edx, dword ptr [ebp-84]

42CFB5E4  |.>|push    edx                ; |Subkey

42CFB5E5  |.>|push    80000002          ; |hKey = HKEY_LOCAL_MACHINE

42CFB5EA  |.>|call    dword ptr [<&ADVAPI32.RegOpenKe>; \RegOpenKeyExA

42CFB5F0  |.>|mov     dword ptr [ebp-518], eax

。。。。。。

42CFC185  |>>xor     eax, eax

42CFC187  |>>mov     esp, ebp

42CFC189  |.>pop     ebp

42CFC18A  \.>retn?溢出后,这里返回改变流程!

 

从下图可见111串长度为60h+4即可用我们的数据改写返回地址。

MS02039分析 - appall - 且行且记录

 

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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