IEIFRAM漏洞的簡單分析和臨時補丁(轉)[@more@]
1. 漏洞的由來 bugtraq上有人釋出了一個針對IE iframe的exploit, 用的方法非常巧妙,針對2K IE6能做到基本通用了. 牛人就是牛人.
2. 漏洞的分析. IE 在處理iframe 標籤的時候,會呼叫SHDOCVW!CBaseBrowser2::SetFrameName函式來進行unicode copy(wcscpy):
.text:71754F67 ; public: virtual long __stdcall CBaseBrowser2::SetFrameName(unsigned short *)
.text:71754F67 ?SetFrameName@CBaseBrowser2@@UAGJPAG@Z proc near ; DATA XREF: .text:717233B8o
.text:71754F67
; .text:71739900o
.text:71754F67
.text:71754F67 arg_0
= dword ptr
4
.text:71754F67 arg_4
= dword ptr
8
.text:71754F67
.text:71754F67
mov
eax, [esp+arg_0]
.text:71754F6B
push
[esp+arg_4]
; wchar_t *
.text:71754F6F
add
eax, 368h
.text:71754F74
push
eax
; wchar_t *
.text:71754F75
call
ds:__imp__wcscpy
.text:71754F7B
pop
ecx
.text:71754F7C
pop
ecx
.text:71754F7D
xor
eax, eax
.text:71754F7F
retn
8
.text:71754F7F ?SetFrameName@CBaseBrowser2@@UAGJPAG@Z endp
在複製iframe的name時候,沒有進行邊界檢查,導致了溢位.
3. 能覆蓋的東西 這裡沒有進行深入研究,大部分引用exp的原文.
這個exp覆蓋了一個結構,什麼結構目前未知, 按照作者的說法,是在
7178EC02
8B08
MOV
ECX, DWORD PTR [EAX]
//[0x0D0D0D0D] == 0x0D0D0D0D, so ecx = 0x0D0D0D0D.
7178EC04
68 847B7071
PUSH
71707B84
7178EC09
50
PUSH
EAX
7178EC0A
FF11
CALL
NEAR DWORD PTR [ECX]
這裡的時候,因為其中的一個指標被覆蓋,最後當程式執行到
7178EC0A 的時候,會跳轉到ecx.而ecx是一個受控制的區域.(其實
是透過暴力擴大記憶體區域,使0d0d0d0d總能指向我們的javascript請求的記憶體塊) 這個從他的exp上能很好的看出來,這裡就不多說了.
4. 補丁. 目前microsoft官方還沒有釋出補丁, 但是未了避免遭受毒害, 我還是想簡單的patch一下. 思想是用msvcrt!wcsncpy來代替wcscpy.
因為要保證位元組一至,就沒有嚴格做到程式的輸入/返回一樣.
下面是做的簡單補丁:
text:71754F67 sub_71754F67
proc near
; DATA XREF: .text:717233B8o
.text:71754F67
; .text:71739900o
.text:71754F67
.text:71754F67 arg_0
= dword ptr
4
.text:71754F67
.text:71754F67
mov
eax, [esp+arg_0]
.text:71754F6B
push
20h
.text:71754F6D
push
esi
.text:71754F6E
add
eax, 368h
.text:71754F73
push
eax
.text:71754F74
mov
eax, 780104FCh
.text:71754F79
call
eax
.text:71754F7B
pop
ecx
.text:71754F7C
pop
ecx
.text:71754F7D
pop
eax
.text:71754F7E
nop
.text:71754F7F
retn
8
.text:71754F7F sub_71754F67
endp
因為在前面呼叫的時候就是push esi來做arg 2的,所以這裡直接用push esi 節省了幾個位元組的指令. 後面本來是要返回0的,但
因為call 一個8位元組的地址在6位元組內沒有解決(不知道大家有沒有好方法?) 所以只好犧牲eax了, 其實呼叫返回後eax本身也沒用.
[root@DUMPLOGIN C:WINNTsystem32dllcache]#fc /b shdocvw.dll shdocvw.dll.org
正在比較檔案 shdocvw.dll 和 SHDOCVW.DLL.ORG
0005436B: 6A FF
0005436C: 20 74
0005436D: 56 24
0005436E: 05 08
0005436F: 68 05
00054370: 03 68
00054371: 00 03
00054373: 50 00
00054374: B8 50
00054375: FC FF
00054376: 04 15
00054377: 01 6C
00054378: 78 12
00054379: FF 70
0005437A: D0 71
0005437D: 58 33
0005437E: 90 C0
5. 使用. patch補丁後, 用zap 刪除掉shdocvw.dll,然後將這個copy過去,開啟IE, 再來瀏覽exploit頁,發現已經攻擊無效了.
6. 鬱悶: 很奇怪的是,在explorer中載入我修改後的shdocvw.dll和IE中載入的不一樣,
具體在:
explorer中:
0:015> uf SHDOCVW!CBaseBrowser2::SetFrameName
SHDOCVW!CBaseBrowser2::SetFrameName:
00dd4f67 8b442404
mov
eax,[esp+0x4]
00dd4f6b 6a20
push
0x20
00dd4f6d 56
push
esi
00dd4f6e 0568030000
add
eax,0x368
00dd4f73 50
push
eax
00dd4f74 b8fc040178
mov
eax,0x780104fc
00dd4f79 6760
pushad
00dd4f7b 59
pop
ecx
00dd4f7c 59
pop
ecx
00dd4f7d 58
pop
eax
00dd4f7e 90
nop
00dd4f7f c20800
ret
0x8
IE中:
SHDOCVW!CBaseBrowser2::SetFrameName:
71754f67 8b442404
mov
eax,[esp+0x4]
71754f6b 6a20
push
0x20
71754f6d 56
push
esi
71754f6e 0568030000
add
eax,0x368
71754f73 50
push
eax
71754f74 b8fc040178
mov
eax,0x780104fc
71754f79 ffd0
call
eax
71754f7b 59
pop
ecx
71754f7c 59
pop
ecx
71754f7d 58
pop
eax
71754f7e 90
nop
71754f7f c20800
ret
0x8
注意到了嗎?
00dd4f79 6760
pushad
vs
71754f79 ffd0
call
eax
這裡沒有深入研究, 不知道為什麼會出現這種情況.
·上一篇:·下一篇:
|
|
最新更新 |
|
|
|
······························ | |
|
|
|
| | | | | | | |
|
|
Copyright © 2004 - 2007 All Rights Reserved
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-969906/,如需轉載,請註明出處,否則將追究法律責任。
|