首页
社区
课程
招聘
[原创]MPEG-2 0day漏洞:缓冲区溢出覆盖SEH
发表于: 2009-7-6 05:43 29401

[原创]MPEG-2 0day漏洞:缓冲区溢出覆盖SEH

2009-7-6 05:43
29401

作者blog:http://hi.baidu.com/yicong2007
目   的:纯属学习,请勿用于恶意用途。
系统环境:XP SP3 简体中文版,IE 7
工   具:WinDbg+IDA

感谢mj0011指正了我原先分析的错误,感谢云砉生指出了出现漏洞的实质原因。

MPEG-2 0day是一个ReadFile时的缓冲区溢出,通过覆盖SEH配合heap spray使得shellcode获得执行机会。

漏洞利用网页http://vip762.3322.org/aa/index.htm

相关畸形文件logo.gif内容:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   00 03 00 00 11 20 34 00  00 00 00 00 00 00 00 00   ..... 4.........
00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 FF FF  FF FF 0C 0C 0C 0C 00      ......ÿÿÿÿ.....

因为我不清楚这个编码规范,仅凭后面调试过程中看到的结果,猜测这个结构。
第0-3个字节 0x00000300h,某个属性标识,意义不详
第4-5个字节 0x2011h,这似乎又是一个属性值(代码中根据这个属性值不同去到不同的分支)
第6-9个字节 0x00000034h, 这个似乎指的是该DWORD后面的内容的长度。
第10-13个字节 与第6-9个字节一起被读入,用途不详。
第14个字节及以后:由于代码对缓冲区地址以及指针的处理有误,这部分数据被读入栈中,造成缓冲区溢出覆盖掉SEH,使shellcode获得执行机会。

触发过程:
在msvidctl.dll的ATL::AtlIPersistStreamInit_Load调用ATL::CComVariant::ReadFromStream的时候,后者通过读取文件中的这个标识内容长度的0x00000034h,并调用mshtml!FatStream::Read(是对ReadFile的封装)将内容读入内存。
ATL::CComVariant::ReadFromStream成功申请了内存,但是在调用mshtml!FatStream::Read的时候犯了一个程序员经常犯的错误(感谢云砉生指出这一点),即将保存缓冲区指针的堆栈地址当成缓冲区指针本身传入(将传入参数buff误写为&buff),使得读入的文件内容覆盖掉了属于ATL::AtlIPersistStreamInit_Load的局部变量以及其设置的SEH,其中0xFFFFFFFF与0x0C0C0C0C刚好覆盖掉SEH,0x0C0C0C0C这个地址已通过Heap spray被shellcode前面的nop占据,结果ATL::AtlIPersistStreamInit_Load在后续操作中触发了异常,就跳到shellcode中执行了。

ATL::AtlIPersistStreamInit_Load的代码如下,注意注释的标号说明顺序。

.text:59F0D3BA
.text:59F0D3BA ; *************** S U B R O U T I N E ***************************************
.text:59F0D3BA
.text:59F0D3BA
.text:59F0D3BA long __stdcall ATL::AtlIPersistStreamInit_Load(struct IStream *, struct ATL::ATL_PROPMAP_ENTRY *, void *, struct IUnknown *, bool) proc near

.text:59F0D3BA                 mov     eax, offset loc_59FC730E
.text:59F0D3BF                 call    __EH_prolog
.text:59F0D3BF
.text:59F0D3C4                 sub     esp, 18h        ; (5)第三次到达这里,插入SEH后,这个SEH最后被溢出覆盖了
.text:59F0D3C7                 mov     eax, [ebp+8]
.text:59F0D3CA                 push    ebx
.text:59F0D3CB                 push    esi
.text:59F0D3CC                 xor     esi, esi
.text:59F0D3CE                 cmp     eax, esi
.text:59F0D3D0                 push    edi
.text:59F0D3D1                 jz      loc_59F0D603
.text:59F0D3D1
.text:59F0D3D7                 mov     ebx, [ebp+0Ch]  ; ATL::ATL_PROPMAP_ENTRY * `public: static struct ATL::ATL_PROPMAP_ENTRY * __stdcall CMPEG2TuneRequest::GetPropertyMap(void)'::`2'::pPropMap
.text:59F0D3DA                 cmp     ebx, esi
.text:59F0D3DC                 jz      loc_59F0D603
.text:59F0D3DC
.text:59F0D3E2                 cmp     [ebp+10h], esi
.text:59F0D3E5                 jz      loc_59F0D603
.text:59F0D3E5
.text:59F0D3EB                 cmp     [ebp+14h], esi
.text:59F0D3EE                 jz      loc_59F0D603
.text:59F0D3EE
.text:59F0D3F4                 cmp     byte ptr [ebp+18h], 0
.text:59F0D3F8                 mov     [ebp+0Ch], esi
.text:59F0D3FB                 jz      short loc_59F0D422 ; (3)第二次进入的时候这里跳走了
.text:59F0D3FB                                         ; (6)第三次进入的时候也跳走了
.text:59F0D3FB
.text:59F0D3FD                 mov     ecx, [eax]
.text:59F0D3FF                 push    esi
.text:59F0D400                 push    4
.text:59F0D402                 lea     edx, [ebp-14h]  ; Buffer
.text:59F0D405                 push    edx
.text:59F0D406                 push    eax
.text:59F0D407                 call    dword ptr [ecx+0Ch] ; (1)mshtml!FatStream::Read,第一次读取最前面4个字节
.text:59F0D40A                 cmp     eax, esi
.text:59F0D40C                 mov     [ebp+0Ch], eax
.text:59F0D40F                 jl      loc_59F0D608
.text:59F0D40F
.text:59F0D415                 cmp     dword ptr [ebp-14h], 300h ; [ebp-14]==0x300
.text:59F0D41C                 ja      loc_59F0D5C7
.text:59F0D41C
.text:59F0D422
.text:59F0D422 loc_59F0D422:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+41j
.text:59F0D422                 mov     [ebp+18h], esi
.text:59F0D425                 cmp     [ebx+8], esi
.text:59F0D428                 mov     [ebp-4], esi
.text:59F0D42B                 mov     [ebp-10h], esi
.text:59F0D42E                 jz      loc_59F0D5ED
.text:59F0D42E
.text:59F0D434                 mov     [ebp-14h], ebx
.text:59F0D434
.text:59F0D437
.text:59F0D437 loc_59F0D437:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+1F4j
.text:59F0D437                 mov     eax, [ebx+0Ch]
.text:59F0D43A                 cmp     eax, esi
.text:59F0D43C                 jz      short loc_59F0D489 ; (7)第三次进入的时候这里跳走了
.text:59F0D43C
.text:59F0D43E                 push    4
.text:59F0D440                 mov     esi, eax
.text:59F0D442                 pop     ecx
.text:59F0D443                 mov     edi, offset __GUID_2a6e293d_2595_11d3_b64c_00c04f79498e
.text:59F0D448                 xor     eax, eax
.text:59F0D44A                 repe cmpsd
.text:59F0D44C                 jnz     short loc_59F0D487
.text:59F0D44C
.text:59F0D44E                 call    dword ptr [ebx+8]
.text:59F0D451                 test    eax, eax
.text:59F0D453                 jz      loc_59F0D5B6
.text:59F0D453
.text:59F0D459                 mov     ecx, [ebx+10h]
.text:59F0D45C                 add     ecx, [ebp+10h]
.text:59F0D45F                 push    0
.text:59F0D461                 push    dword ptr [ebp+14h]
.text:59F0D464                 push    ecx
.text:59F0D465                 push    eax
.text:59F0D466                 push    dword ptr [ebp+8]
.text:59F0D469                 call    ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool) ; (2)重入
.text:59F0D469                                         ; (4)又一次重入
.text:59F0D469
.text:59F0D46E                 test    eax, eax
.text:59F0D470                 mov     [ebp+0Ch], eax
.text:59F0D473                 jge     loc_59F0D513
.text:59F0D473
.text:59F0D479                 mov     eax, [ebp+18h]
.text:59F0D47C                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:59F0D480                 test    eax, eax
.text:59F0D482                 jmp     loc_59F0D5F6
.text:59F0D482
.text:59F0D487 ; ---------------------------------------------------------------------------
.text:59F0D487
.text:59F0D487 loc_59F0D487:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+92j
.text:59F0D487                 xor     esi, esi
.text:59F0D487
.text:59F0D489
.text:59F0D489 loc_59F0D489:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+82j
.text:59F0D489                 cmp     [ebx], esi
.text:59F0D48B                 jz      loc_59F0D5A2
.text:59F0D48B
.text:59F0D491                 xor     eax, eax
.text:59F0D493                 lea     edi, [ebp-24h]  ; (8)
.text:59F0D496                 stosd
.text:59F0D497                 stosd
.text:59F0D498                 stosd
.text:59F0D499                 stosd
.text:59F0D49A                 mov     [ebp-24h], si   ; si=0
.text:59F0D49E                 mov     edi, [ebx+10h]
.text:59F0D4A1                 mov     ecx, [ebx+14h]
.text:59F0D4A4                 add     edi, [ebp+10h]
.text:59F0D4A7                 cmp     ecx, esi
.text:59F0D4A9                 mov     byte ptr [ebp-4], 1
.text:59F0D4AD                 jz      short loc_59F0D4CE
.text:59F0D4AD
.text:59F0D4AF                 movzx   eax, word ptr [ebx+18h]
.text:59F0D4B3                 cmp     eax, 0Bh        ; eax==0dh
.text:59F0D4B6                 jg      short loc_59F0D51A ; (9)跳走了
.text:59F0D4B6
.text:59F0D4B8                 jz      short loc_59F0D529
.text:59F0D4B8
.text:59F0D4BA                 cmp     eax, 2
.text:59F0D4BD                 jl      short loc_59F0D4CE
.text:59F0D4BD
.text:59F0D4BF                 cmp     eax, 3
.text:59F0D4C2                 jle     short loc_59F0D529
.text:59F0D4C2
.text:59F0D4C4                 cmp     eax, 4
.text:59F0D4C7                 jle     short loc_59F0D4CE
.text:59F0D4C7
.text:59F0D4C9                 cmp     eax, 7
.text:59F0D4CC                 jle     short loc_59F0D529
.text:59F0D4CC
.text:59F0D4CE
.text:59F0D4CE loc_59F0D4CE:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+F3j
.text:59F0D4CE                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+103j
.text:59F0D4CE                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+10Dj
.text:59F0D4CE                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+163j
.text:59F0D4CE                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+16Dj
.text:59F0D4CE                 push    dword ptr [ebp+8]  ; 
.text:59F0D4D1                 lea     ecx, [ebp-24h]  
.text:59F0D4D4                 call    ATL::CComVariant::ReadFromStream(IStream *); (11)这里溢出了!
.text:59F0D4D4
.text:59F0D4D9                 cmp     eax, esi
.text:59F0D4DB                 mov     [ebp+0Ch], eax
.text:59F0D4DE                 jl      loc_59F0D5D5
.text:59F0D4DE
.text:59F0D4E4                 mov     ecx, [ebx+14h]
.text:59F0D4E7                 cmp     ecx, esi
.text:59F0D4E9                 jz      short loc_59F0D542
.text:59F0D4E9
.text:59F0D4EB                 mov     eax, ecx
.text:59F0D4ED                 shr     ecx, 2
.text:59F0D4F0                 lea     esi, [ebp-1Ch]
.text:59F0D4F3                 rep movsd
.text:59F0D4F5                 mov     ecx, eax
.text:59F0D4F7                 and     ecx, 3
.text:59F0D4FA                 lea     eax, [ebp-24h]
.text:59F0D4FD                 rep movsb
.text:59F0D4FF                 and     word ptr [ebp-24h], 0
.text:59F0D504                 push    eax             ; pvarg
.text:59F0D505                 mov     byte ptr [ebp-1Ch], 0
.text:59F0D509                 mov     byte ptr [ebp-4], 0
.text:59F0D50D                 call    ds:VariantClear(x)
.text:59F0D50D
.text:59F0D513
.text:59F0D513 loc_59F0D513:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+B9j
.text:59F0D513                 xor     esi, esi
.text:59F0D515                 jmp     loc_59F0D5A2
.text:59F0D515
.text:59F0D51A ; ---------------------------------------------------------------------------
.text:59F0D51A
.text:59F0D51A loc_59F0D51A:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+FCj
.text:59F0D51A                 cmp     eax, 10h
.text:59F0D51D                 jl      short loc_59F0D4CE ; (10)跳走了
.text:59F0D51D
.text:59F0D51F                 cmp     eax, 17h
.text:59F0D522                 jle     short loc_59F0D529
.text:59F0D522
.text:59F0D524                 cmp     eax, 48h
.text:59F0D527                 jnz     short loc_59F0D4CE
.text:59F0D527
.text:59F0D529
.text:59F0D529 loc_59F0D529:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+FEj
.text:59F0D529                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+108j
.text:59F0D529                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+112j
.text:59F0D529                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+168j
.text:59F0D529                 mov     eax, [ebp+8]
.text:59F0D52C                 mov     edx, [eax]
.text:59F0D52E                 push    esi
.text:59F0D52F                 push    ecx
.text:59F0D530                 push    edi
.text:59F0D531                 push    eax
.text:59F0D532                 call    dword ptr [edx+0Ch]
.text:59F0D535                 cmp     eax, esi
.text:59F0D537                 mov     [ebp+0Ch], eax
.text:59F0D53A                 jl      loc_59F0D5D5
.text:59F0D53A
.text:59F0D540                 jmp     short loc_59F0D586
.text:59F0D540
.text:59F0D542 ; ---------------------------------------------------------------------------
.text:59F0D542
.text:59F0D542 loc_59F0D542:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+12Fj
.text:59F0D542                 mov     eax, [ebp-10h]
.text:59F0D545                 cmp     [ebx+0Ch], eax
.text:59F0D548                 jz      short loc_59F0D573
.text:59F0D548
.text:59F0D54A                 mov     eax, [ebp+18h]
.text:59F0D54D                 cmp     eax, esi
.text:59F0D54F                 jz      short loc_59F0D55A
.text:59F0D54F
.text:59F0D551                 mov     [ebp+18h], esi
.text:59F0D554                 mov     ecx, [eax]
.text:59F0D556                 push    eax
.text:59F0D557                 call    dword ptr [ecx+8]
.text:59F0D557
.text:59F0D55A
.text:59F0D55A loc_59F0D55A:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+195j
.text:59F0D55A                 mov     eax, [ebp+14h]
.text:59F0D55D                 mov     ecx, [eax]
.text:59F0D55F                 lea     edx, [ebp+18h]
.text:59F0D562                 push    edx
.text:59F0D563                 push    dword ptr [ebx+0Ch]
.text:59F0D566                 push    eax
.text:59F0D567                 call    dword ptr [ecx]
.text:59F0D569                 test    eax, eax
.text:59F0D56B                 jl      short loc_59F0D5CE
.text:59F0D56B
.text:59F0D56D                 mov     eax, [ebx+0Ch]
.text:59F0D570                 mov     [ebp-10h], eax
.text:59F0D570
.text:59F0D573
.text:59F0D573 loc_59F0D573:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+18Ej
.text:59F0D573                 lea     eax, [ebp-24h]
.text:59F0D576                 push    eax
.text:59F0D577                 push    dword ptr [ebx+4]
.text:59F0D57A                 push    dword ptr [ebp+18h]
.text:59F0D57D                 call    ATL::CComDispatchDriver::PutProperty(IDispatch *,long,tagVARIANT *)
.text:59F0D57D
.text:59F0D582                 test    eax, eax
.text:59F0D584                 jl      short loc_59F0D5CE
.text:59F0D584
.text:59F0D586
.text:59F0D586 loc_59F0D586:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+186j
.text:59F0D586                 cmp     word ptr [ebp-24h], 0FFFh
.text:59F0D58C                 mov     byte ptr [ebp-4], 0
.text:59F0D590                 jnz     short loc_59F0D598
.text:59F0D590
.text:59F0D592                 mov     word ptr [ebp-24h], 8
.text:59F0D592
.text:59F0D598
.text:59F0D598 loc_59F0D598:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+1D6j
.text:59F0D598                 lea     eax, [ebp-24h]
.text:59F0D59B                 push    eax             ; pvarg
.text:59F0D59C                 call    ds:VariantClear(x)
.text:59F0D59C
.text:59F0D5A2
.text:59F0D5A2 loc_59F0D5A2:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+D1j
.text:59F0D5A2                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+15Bj
.text:59F0D5A2                 mov     ebx, [ebp-14h]        ; (18)这里由于前面的溢出,[ebp-14]被覆盖,为0
.text:59F0D5A5                 add     ebx, 20h
.text:59F0D5A8                 cmp     [ebx+8], esi          ; (19)这里访问0x00000028处内存,触发了Access Violation
.text:59F0D5AB                 mov     [ebp-14h], ebx
.text:59F0D5AE                 jnz     loc_59F0D437
.text:59F0D5AE
.text:59F0D5B4                 jmp     short loc_59F0D5ED
.text:59F0D5B4
.text:59F0D5B6 ; ---------------------------------------------------------------------------
.text:59F0D5B6
.text:59F0D5B6 loc_59F0D5B6:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+99j
.text:59F0D5B6                 mov     eax, [ebp+18h]
.text:59F0D5B9                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:59F0D5BD                 test    eax, eax
.text:59F0D5BF                 jz      short loc_59F0D5C7
.text:59F0D5BF
.text:59F0D5C1                 mov     ecx, [eax]
.text:59F0D5C3                 push    eax
.text:59F0D5C4                 call    dword ptr [ecx+8]
.text:59F0D5C4
.text:59F0D5C7
.text:59F0D5C7 loc_59F0D5C7:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+62j
.text:59F0D5C7                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+205j
.text:59F0D5C7                 mov     eax, 80004005h
.text:59F0D5CC                 jmp     short loc_59F0D608
.text:59F0D5CC
.text:59F0D5CE ; ---------------------------------------------------------------------------
.text:59F0D5CE
.text:59F0D5CE loc_59F0D5CE:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+1B1j
.text:59F0D5CE                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+1CAj
.text:59F0D5CE                 mov     dword ptr [ebp+0Ch], 80004005h
.text:59F0D5CE
.text:59F0D5D5
.text:59F0D5D5 loc_59F0D5D5:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+124j
.text:59F0D5D5                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+180j
.text:59F0D5D5                 cmp     word ptr [ebp-24h], 0FFFh
.text:59F0D5DB                 jnz     short loc_59F0D5E3
.text:59F0D5DB
.text:59F0D5DD                 mov     word ptr [ebp-24h], 8
.text:59F0D5DD
.text:59F0D5E3
.text:59F0D5E3 loc_59F0D5E3:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+221j
.text:59F0D5E3                 lea     eax, [ebp-24h]
.text:59F0D5E6                 push    eax             ; pvarg
.text:59F0D5E7                 call    ds:VariantClear(x)
.text:59F0D5E7
.text:59F0D5ED
.text:59F0D5ED loc_59F0D5ED:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+74j
.text:59F0D5ED                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+1FAj
.text:59F0D5ED                 mov     eax, [ebp+18h]
.text:59F0D5F0                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:59F0D5F4                 cmp     eax, esi
.text:59F0D5F4
.text:59F0D5F6
.text:59F0D5F6 loc_59F0D5F6:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+C8j
.text:59F0D5F6                 jz      short loc_59F0D5FE
.text:59F0D5F6
.text:59F0D5F8                 mov     ecx, [eax]
.text:59F0D5FA                 push    eax
.text:59F0D5FB                 call    dword ptr [ecx+8]
.text:59F0D5FB
.text:59F0D5FE
.text:59F0D5FE loc_59F0D5FE:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool):loc_59F0D5F6j
.text:59F0D5FE                 mov     eax, [ebp+0Ch]
.text:59F0D601                 jmp     short loc_59F0D608
.text:59F0D601
.text:59F0D603 ; ---------------------------------------------------------------------------
.text:59F0D603
.text:59F0D603 loc_59F0D603:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+17j
.text:59F0D603                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+22j
.text:59F0D603                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+2Bj
.text:59F0D603                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+34j
.text:59F0D603                 mov     eax, 80004003h
.text:59F0D603
.text:59F0D608
.text:59F0D608 loc_59F0D608:                           ; CODE XREF: ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+55j
.text:59F0D608                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+212j
.text:59F0D608                                         ; ATL::AtlIPersistStreamInit_Load(IStream *,ATL::ATL_PROPMAP_ENTRY *,void *,IUnknown *,bool)+247j
.text:59F0D608                 mov     ecx, [ebp-0Ch]
.text:59F0D60B                 pop     edi
.text:59F0D60C                 pop     esi
.text:59F0D60D                 pop     ebx
.text:59F0D60E                 mov     large fs:0, ecx
.text:59F0D615                 leave
.text:59F0D616                 retn    14h
.text:59F0D616
.text:59F0D616 long __stdcall ATL::AtlIPersistStreamInit_Load(struct IStream *, struct ATL::ATL_PROPMAP_ENTRY *, void *, struct IUnknown *, bool) endp ; sp =  4
.text:59F0D616
.text:59F0D616 ; ---------------------------------------------------------------------------

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (54)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
其中的go.jpg其实是个js脚本。
这是网页中的原样,如果直接执行将可触发漏洞并下载病毒,请慎用。
shellcode内容就不分析了,复杂度超不过我以前分析的那两个,下载的病毒URL地址是http://xin765.com/wm/svchost.exe。
上传的附件:
2009-7-6 05:52
0
雪    币: 290
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
小聪 分析的很详细,学习啊学习
2009-7-6 06:56
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那么早....
2009-7-6 07:22
0
雪    币: 4396
活跃值: (4383)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很强大的小聪~~  
2009-7-6 08:23
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
太聪明了,学习
2009-7-6 08:49
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rsa
7
不错的漏洞 不错的分析
2009-7-6 09:01
0
雪    币: 7318
活跃值: (3793)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
8
地球太危险,还是去火星吧
出售去火星的机票,2000kx一张
2009-7-6 09:12
0
雪    币: 538
活跃值: (460)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
9
不懂,飘过。。。
2009-7-6 09:12
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很好很强大
很黄很暴力
2009-7-6 09:19
0
雪    币: 11804
活跃值: (4069)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我昨天看见还想看详情了,没想到小聪今天就发了,仔细看看
2009-7-6 09:33
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
補充一下小蔥~~
開始分配0x10的地方~
.text:59F0D35D                             pvarg           = VARIANTARG ptr -24h
.text:59F0D35D                             var_14          = dword ptr -14h
.text:59F0D35D                             var_10          = dword ptr -10h

後邊讀取流的時候開始已經用了0xa了,然後根據流文件中指定的大小接著讀,直接覆蓋~
2009-7-6 10:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
小聪通宵 要支持
2009-7-6 10:08
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
14
分析正确~~~
2009-7-6 10:19
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
15
不过可用的缓冲应该只有4字节才对吧,哪来的0x10个字节?
2009-7-6 10:40
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
16
强大的小聪~~
支持了.
2009-7-6 10:43
0
雪    币: 185
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
过来学习下漏洞精神
2009-7-6 10:45
0
雪    币: 557
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
只能膜拜 不能学习
2009-7-6 10:54
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
19
学习了 强悍啊
2009-7-6 11:59
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
来看一下。。
2009-7-6 13:14
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
21
终于明白楼主说0x10个字节的意思了,楼主对这个代码的理解有误。
他传入的buffer并不是这个ReadStream函数的第一个参数,这个参数已经存入寄存器,并在后面被用做一个临时变量了。
也就是说,这个buffer只有4个字节长度,而不是0x10个字节。楼主没有仔细看过程,有点想当然了

*****
2009-7-6 13:18
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
22
多谢MJ指正
2009-7-6 13:49
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习。学习。
2009-7-6 15:11
0
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
感谢分享,确实是个很严重的漏洞!
暂时删了 MPEG2TuneRequest 的CLSID,以后虚拟机里慢慢折腾

发个删CLSID的注册表文件,或者手动搜0955AC62-BF2E-4CBA-A2B9-A63F772D46CF,删掉后至少这个Shellcode没法运行了:
Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\BDATuner.MPEG2TuneRequest]

[-HKEY_CLASSES_ROOT\BDATuner.MPEG2TuneRequest.1]

[-HKEY_CLASSES_ROOT\CLSID\{0955AC62-BF2E-4CBA-A2B9-A63F772D46CF}]

[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\{0955AC62-BF2E-4CBA-A2B9-A63F772D46CF}]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\BDATuner.MPEG2TuneRequest]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\BDATuner.MPEG2TuneRequest.1]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0955AC62-BF2E-4CBA-A2B9-A63F772D46CF}]
上传的附件:
2009-7-6 15:56
0
雪    币: 200
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
WIN2003
补丁全打

有效。。。那段加密的东东咋回事
2009-7-6 16:01
0
游客
登录 | 注册 方可回帖
返回
//