好吧,我承認我昨天是在弄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下是無法利用的了,當然如果有什麼牛人有啥新的利用方法,也請告訴我。
欲知後事如何,且聽下回分解。