2012年(272)
分类: 服务器与存储
2012-06-25 13:38:50
好吧,我承认我昨天是在弄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下是无法利用的了,当然如果有什么牛人有啥新的利用方法,也请告诉我。
欲知后事如何,且听下回分解。