首页 > 网络安全 > 小心我“DIR”溢出你!(上)

小心我“DIR”溢出你!(上)

2008年7月23日 发表评论 阅读评论

from:大风起兮云飞扬
好吧,我承认我昨天是在弄DIR溢出

不是sharpxxxxx那个。

dir溢出其实有好几个,有的和cmd有关,有的需要特定环境。

我今天整的这个又是一个YY漏洞。

微软一直没有补,因为在微软看来,这个应该不属于漏洞吧,溢出了也提不了权限,顶多算一个bug。

所以很多牛人都不整这个bug,而最近dummy爆了一个暴风影音的0day,也是个unicode的,我只在IE里触发了,不知道在perl脚本下咋触发,后来想起了这个dir漏洞。

我最喜欢做的事情就是整些没用的,仅仅用来YY的东西,时不时自虐一下,所以今天看看这个dir溢出。

在我的xp sp2 cn上,cmd版本

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

首先,触发漏洞:

D:>dir \\?\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA……(超长)

就溢出了,cmd crash,简单吧

大概200多个A就可以造成溢出。

看看溢出时候的状况:

发现输出的参数: A 经过unicode编码后,一路覆盖到了栈底,异常了~~~

异常时寄存器如下:

停在这里:
77C17EA2         66:8901              MOV WORD PTR DS:[ECX],AX          ; //===> EIP指向这里
77C17EA5         41                   INC ECX
77C17EA6         41                   INC ECX

SEH也被覆盖了:
0013FF30        00410041  A.A.
0013FF34        00410041  A.A.  指向下一个 SEH 记录的指针
0013FF38        00410041  A.A.  SE处理程序
0013FF3C        00410041  A.A.
0013FF40        00410041  A.A.
0013FF44        00410041  A.A.

其实栈溢出也好利用,要么覆盖返回地址,要么覆盖seh。

第二次找到漏洞原因,重新设定好断点,触发之:

溢出就发生在这个该死的 wcscpy 里

实际上是 wcscpy( [ebp-210h], [ebp-41C] );

跟进去后:
77C17E94 >  8BFF                 MOV EDI,EDI
77C17E96         55                              PUSH EBP
77C17E97         8BEC                     MOV EBP,ESP
77C17E99         8B4D 08             MOV ECX,DWORD PTR SS:[EBP+8]
77C17E9C         8B55 0C            MOV EDX,DWORD PTR SS:[EBP+C]
77C17E9F         66:8B02             MOV AX,WORD PTR DS:[EDX]
77C17EA2         66:8901             MOV WORD PTR DS:[ECX],AX
77C17EA5         41                             INC ECX
77C17EA6         41                              INC ECX
77C17EA7         42                             INC EDX
77C17EA8         42                              INC EDX
77C17EA9         66:85C0            TEST AX,AX
77C17EAC  ^ 75 F1                 JNZ SHORT msvcrt.77C17E9F
77C17EAE         8B45 08            MOV EAX,DWORD PTR SS:[EBP+8]
77C17EB1         5D                          POP EBP
77C17EB2         C3                               RETN

跟完之后才发现一个见鬼的地方,由于src和dest相距不远,所以在拷贝的过程中,dest把src的末尾的0字节给覆盖掉啦~~ 这样这个拷贝就因为找不到src的0字节而无法结束,所以会一直拷贝下去。

最后的结果就是在栈里有了若干个拷贝的镜像,最后因为一路覆盖到了栈底,所以异常了!

注意看 \.\.?.\. 是分隔不同拷贝的地方

如果这个溢出是发生在堆里,那么就heap spray了,最后会造成内存泄露。

这里是发生在栈里的,那就叫做 stack spray吧!

由于这里肯定会异常,wcscpy根本就无法正常返回,所以覆盖返回地址控制的方法可以不同考虑了。

那么正常人都会想到这里覆盖seh利用

而在这里seh也确实是被我们覆盖掉了。

不过可惜的是,xp sp2已经有了safeseh的保护了。而我们这个漏洞更是可怜的很。

可以看到,加载的模块居然没有一个可以利用的~!

然后诡异的事情发生了,本以为代码页是可以跳转的,结果在这里都不行。

经过测试,唯一能跳转的是内存中属性为 ”RE" 的段,以及cmd.exe自己注册的seh handler

到了这里,基本可以判断在正常情况下这个漏洞在xp sp2下是无法利用的了,当然如果有什么牛人有啥新的利用方法,也请告诉我。

欲知后事如何,且听下回分解。

转载请注明:woyigui's blog [http://www.woyigui.cn/]
本文标题:小心我“DIR”溢出你!(上)
本文地址:http://www.woyigui.cn/2008/07/23/dir-on/

分类: 网络安全 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
*