万众瞩目的MS07-004终于POC出炉了,之前小弟一直因为eeye的补丁比较工具bindiff在罢工,再加上一些琐事缠身,所以也没好好看这个
漏洞。
今天在eong兄和milw0rm上那位公布poc的老兄的基础上,好好跟了下这个
漏洞。
以下所有调试过程都是在简体中文版的XP SP2 Pro上进行的。
首先,看写别人比较出来的
因为他是在韩文系统上比较出来的,所以在中文版地址上有些不同,其实关系不大,只需要用OD搜 imul eax, eax, 2ch就可以定位到问题了。
在我的系统上是:
6FF176A5 5F POP EDI
6FF176A6 5B POP EBX
6FF176A7 8B46 08 MOV EAX,DWORD PTR DS:[ESI+8]
6FF176AA 0346 04 ADD EAX,DWORD PTR DS:[ESI+4]
6FF176AD 85C0 TEST EAX,EAX
6FF176AF 7E 13 JLE SHORT vgx.6FF176C4
6FF176B1 6BC0 2C IMUL EAX,EAX,2C ;相乘,整数
溢出6FF176B4 68 01010000 PUSH 101
6FF176B9 50 PUSH EAX
6FF176BA E8 3588FBFF CALL vgx.6FECFEF4 ; malloc()
6FF176BF 59 POP ECX
6FF176C0 59 POP ECX
6FF176C1 8946 14 MOV DWORD PTR DS:[ESI+14],EAX
6FF176C4 B0 01 MOV AL,1
6FF176C6 5E POP ESI
6FF176C7 5D POP EBP
6FF176C8 C2 0C00 RETN 0C
这里是因为没有针对eax做检查,导致了整数
溢出相乘后,反而使malloc(eax*2ch)的空间变小了
在后来有一个movs的操作,会把内存一片片的拷到刚才malloc出来的地方。
在这个过程中,会覆盖掉 mshtml.dll中的一个虚函数保存在堆里的指针。
call [ecx + 10h]
而这里的ecx正好是我们可以控制的。
在这里不得不提以下,
漏洞触发的两个关键地方:
第一个:
<v:recolorinfo recolorstate="t" numcolors="1" numfills="1073741831">
这里后面的大整数可以是numcolors, 也可以放在numfills ,我这里放在了numfills里,其实都差不多。
6FF176A7 8B46 08 MOV EAX,DWORD PTR DS:[ESI+8]
6FF176AA 0346 04 ADD EAX,DWORD PTR DS:[ESI+4]
因为这两句会把这个大整数传递给EAX,在后面给eax*2ch 用
第二个关键的地方是:
<v:recolorinfoentry tocolor="rgb(90,22,64)"
lbcolor="rgb(90,22,64)" forecolor="rgb(90,22,64)" backcolor="rgb(90,22,64)"
fromcolor="rgb(90,22,64)" lbstyle ="13" bitmaptype="13" />
参数或许还有可以精简的地方,我没细改了。
在这里, rgb(a,b,c)
这里的a, b , c 可以直接传递到内存里面去,也会直接传递给后面的ecx
从而我们可以控制 call [ecx + 10h]
在这里,因为rgb只有3个参数,所以,地址的第一个字节只能是0x00
我在这里选择了rgb(90,22,64)
实际上就是 : 0x0040165A
这个地址是在iexplorer.exe里的
注意:不同系统和不同语言的这个地址可能会不同
至于如何通用这里就不提到了,因为这里也跟eong兄讨论过的,不方便发出来。
这个地址加10h
就是 0x0040166A
他指向了 0x0c15xxxx 而这个地址是正好落在我们的heap spray中间的,所以就跳转到了我们的shellcode。
下面是我们的POC, 如果一切正常,会在你的系统你添加一个帐户名为axis的管理员帐户。
另外这个
漏洞比上次的ms06-055要好,可以恢复栈平衡,达到不挂ie的效果
<!--
MS07-004 VML integer overflow exploit
by axis@ph4nt0m.org
-->
文章录入:cainiaowang 责任编辑:cainiaowang