Heap Spray浅析:MS06-055(CVE-2006-4868)分析

Heap Spray是一种通过(比较巧妙的方式)控制堆上数据,继而把程序控制流导向ShellCode的古老艺术。

主要应用于在成功覆盖函数指针,且shellcode布置在堆中,如何绕过堆分配的地址随机来定位到shellcode去执行。

Heap Spray浅析好多大佬的博客都会推荐这一篇:Heap Spray原理浅析

Heap Spray浅析:MS06-055(CVE-2006-4868)分析_第1张图片
Windows内存布局

Windows下内存布局大致上是栈 - 堆 – 全局静态数据 & 常量数据(低地址到高地址),且堆的区域很可能分布在虚拟地址空间的很多地方。但堆的起始分配地址是很低的。

Heap Spray浅析:MS06-055(CVE-2006-4868)分析_第2张图片

当申请大量的内存到时候,堆很有可能覆盖到的地址是0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等等几个地址

Heap Spray浅析:MS06-055(CVE-2006-4868)分析_第3张图片

注意这里如果直接放置shellcode,那么在程序跳转到0x0c0c0c0c去执行的时候,很有可能落在shellcode中间,从而无法有效执行。

0x00 slidecode

这就要用到slidecode,即一些无用的指令如"\x90"(nops)、"\x0c"((0x0C0C代表的x86指令是OR AL 0x0C)等,即使0x0c0c0c0c落在其中,也只是会执行一些无用的指令,从而滑向后面的shellcode。

例如这里shellcode的长度大概为200字节,分配的内存块是1M,slidecode填充1048376个字节,命中率为1048376/1M=0.99980926513671875,基本可以确保命中shellcode。

slidecode的选取视具体情况而定,例如如果覆盖了虚表地址,由于其二次寻址的方式,如果仍然填充0x90即nops作为slidecode,那么程序会试图从[0x90909090]处寻址取到虚函数的入口地址,显然这是一个无效地址程序会出错退出。这种情况下就应该使用0x0c0c0c0c的填充。

0x01 MS06-055分析

IE在解析VML语言(矢量标记语言)时存在基于栈的缓冲区漏洞。

一个VML语言的例子:

test

这段VML代码告诉客户端在屏幕上绘制一个尺寸为44像素的颜色为黑色的正方形。

在Win2000下用IE5打开:

Heap Spray浅析:MS06-055(CVE-2006-4868)分析_第4张图片

VML语言主要用来表示一些简单的矢量图,替代jpg等图片格式的开销。

引起漏洞的是IE的核心组件vgx.dll,这个文件在目录C:\Program Files\Common Files\Microsoft Shared\VGX下可以找到。

实验环境   :Windows2000 sp0-sp4   或   Windows XP sp1

vgx.dll版本:5.0.3014.1003

引起漏洞的函数是SHADETYPE_TEXT::TEXT(ushort const *,int),它会将这个数据域中的字符串(”QQQQ”)在未经长度限制的情况下复制到栈中。

IDA找到这个函数(符号表中没有函数的名字,只能根据地址直接定位):

Heap Spray浅析:MS06-055(CVE-2006-4868)分析_第5张图片

0x02 poc页面

Heap Spray浅析:MS06-055(CVE-2006-4868)分析_第6张图片

你可能感兴趣的:(Heap Spray浅析:MS06-055(CVE-2006-4868)分析)