Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1198795
  • 博文数量: 272
  • 博客积分: 3899
  • 博客等级: 中校
  • 技术积分: 4734
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-15 14:53
文章分类

全部博文(272)

文章存档

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下是无法利用的了,当然如果有什么牛人有啥新的利用方法,也请告诉我。


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

阅读(1366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~