翻译:Advanced Exploitation of Internet Explorer Heap Overflow Vulnerabilities (MS12-004)
题注:由仙果翻译,其中肯定有错误之处,欢迎大家指正,感激不尽。
原始链接为:
http://www.vupen.com/blog/20120117.Advanced_Exploitation_of_Windows_MS12-004_CVE-2012-0003.php
嗨,大家好!
2012年刚刚开始CVE上就爆出了很多有趣的漏洞。其中一个就是CVE-2012-0003,一个危急级别的漏洞影响到了微软多媒体库并且与MIDI文件处理流程有关。在上个星期已经作为MS12-004公告的一部分进行修补。
鉴于此漏洞的危急程度,我们建议尽快打上补丁。
从维基百科上,我们能知道:“MIDI 是一个1982年制定的行业标准协议”,基本上在它制定30年后,这种格式仍然触发像微软这样的软件厂商的漏洞。
单独来说,这种漏洞非常常见但是漏洞利用并不容易,像Windows Media Player 或者Internet Explorer这样的应用程序解析一个MIDI文件时,
分配一个静态的堆缓冲区但写入却是超过0x440个字节(漏洞触发原因)。为了处理如此大的分配大小,Internet Explorer下通用的利用技巧并不适用这个漏洞,
这才是真正有挑战性的事情。
此博客中,我们将演示说明此漏洞的危急程度,通过Internet Explorer 9/8/7/6绕过ASLR/DEP实现代码执行。
1.漏洞分析技巧
这是漏洞的关键点。一个MIDI文件只要包含2种类型结构块,一个名称是MThd,另一个是MTrk。下列表格是2个部分的结构:
处理文件之前,Windows Media 在”winmm.dll”中使用”mseOpen”函数分配2个缓冲区:
.text:76B5CDB1 mov edi, [ebp+arg_4]
.text:76B5CDB4 mov eax, [edi+10h]
.text:76B5CDB7 lea eax, ds:94h[eax*8]
.text:76B5CDBE cmp eax, 10000h
.text:76B5CDC3 mov [ebp+var_4], 7
.text:76B5CDCA jnb loc_76B5CED7
.text:76B5CDD0 push ebx
.text:76B5CDD1 push esi
.text:76B5CDD2 push eax
.text:76B5CDD3 call winmmAlloc(x) //分配一个缓冲区
.text:76B5CDD8 mov esi, eax
.text:76B5CDDA xor ebx, ebx
.text:76B5CDDC cmp esi, ebx
.text:76B5CDDE jz loc_76B5CED5
.text:76B5CDE4 push 400h
.text:76B5CDE9 call winmmAlloc(x) // 分配第二个大小为0x400的缓冲区
.text:74903483 loc_74903483:
.text:74903483 push [ebp+arg_C]
.text:74903486 lea eax, [ebp+var_14]
.text:74903489 push eax
.text:7490348A push esi
.text:7490348B call smfGetNextEvent(x,x,x) // 读取一个事件并放在var_8(变量8)
74903490 test eax, eax
.text:74903492 jnz loc_749035B1
.text:74903498 mov ecx, [ebp+var_8]
.text:7490349B cmp cl, 0F0h
.text:7490349E jnb short loc_749034EC
.text:749034B4 loc_749034B4:
.text:749034B4
.text:749034B4 mov eax, [esi+10h]
.text:749034B7 add eax, [ebp+var_14]
.text:749034BA movzx ecx, cl
.text:749034BD mov [edi], eax // 写入第一个dword
.text:749034BF and dword ptr [esi+10h], 0
.text:749034C3 add edi, 4
.text:749034C6 and dword ptr [edi], 0 //写入 0
.text:749034C9 movzx eax, byte ptr [ebp+var_8+2]
.text:749034CD movzx edx, byte ptr [ebp+var_8+1]
.text:749034D1 shl eax, 8
.text:749034D4 or eax, edx
.text:749034D6 shl eax, 8
.text:749034D9 add edi, 4
.text:749034DC or eax, ecx
.text:749034DE
.text:749034DE loc_749034DE:
.text:749034DE mov [edi], eax //写入事件
.text:749034E0 add edi, 4
.text:749034E3 add dword ptr [ebx+8], 0Ch // 增加计数器
.text:749034E7 jmp loc_749035A2
.text:76B5D0B2 mov eax, [ebp+wParam]
.text:76B5D0B5 mov ecx, [ebx+eax] // 读取一个事件存放在ECX 中
.text:76B5D0B8 add ebx, 4
.text:76B5D0BB mov eax, ecx
.text:76B5D0BD mov [esi+24h], ebx
.text:76B5D0C0 shr eax, 18h
.text:76B5D0C3 and ecx, 0FFFFFFh // ecx = e3 e2 e1
.text:76B5D1B6 loc_76B5D1B6:
.text:76B5D1B6 cmp [ebp+hmo], ebx
.text:76B5D1B9 mov esi, [edi+84h]
.text:76B5D1BF jz loc_76B5D276
.text:76B5D1C5 test cl, cl // cl = e1
.text:76B5D1C7 mov al, cl // al = e1
.text:76B5D1C9 mov ebx, ecx
.text:76B5D1CB js short loc_76B5D1E3 // jump if 80h <= e1 <= FFh
[...]
.text:76B5D1E3 loc_76B5D1E3:
.text:76B5D1E3 mov edx, ecx
.text:76B5D1E5 shr edx, 8 // dl = e2
.text:76B5D1E8 mov [edi+54h], cl
.text:76B5D1EB mov byte ptr [ebp+wParam+3], dl
.text:76B5D1EE shr ebx, 10h // bl = e3
.text:76B5D1F1 loc_76B5D1F1:
.text:76B5D1F1 mov dl, al // dl = e1
.text:76B5D1F3 and dl, 0F0h
.text:76B5D1F6 cmp dl, 90h
.text:76B5D1F9 mov [ebp+var_1], dl
.text:76B5D1FC jz short loc_76B5D203
.text:76B5D1FE cmp dl, 80h
.text:76B5D201 jnz short loc_76B5D25F
.text:76B5D203 loc_76B5D203:
.text:76B5D203 movzx edx, byte ptr [ebp+wParam+3] // edx = e2
.text:76B5D207 and eax, 0Fh // eax = e1 & 0Fh
.text:76B5D20A shl eax, 7
.text:76B5D20D add eax, edx
.text:76B5D20F cdq
.text:76B5D210 sub eax, edx
.text:76B5D212 sar eax, 1
.text:76B5D214 cmp [ebp+var_1], 80h
.text:76B5D218 jz short loc_76B5D244
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)