Heap Spray是一种通过(比较巧妙的方式)控制堆上数据,继而把程序控制流导向ShellCode的古老艺术。
主要应用于在成功覆盖函数指针,且shellcode布置在堆中,如何绕过堆分配的地址随机来定位到shellcode去执行。
Heap Spray浅析好多大佬的博客都会推荐这一篇:Heap Spray原理浅析
Windows内存布局Windows下内存布局大致上是栈 - 堆 – 全局静态数据 & 常量数据(低地址到高地址),且堆的区域很可能分布在虚拟地址空间的很多地方。但堆的起始分配地址是很低的。
当申请大量的内存到时候,堆很有可能覆盖到的地址是0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等等几个地址
注意这里如果直接放置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语言的例子:
<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<title>test</title>
<style>
<!--v\:* behavior:url(#default#VML); }-->
</style>
</head>
<body>
<v:rect style="width:44pt;height:44pt" fillcolor="black">
<v:fill method="qqqq"/>
</v:rect>
</body>
</html>
这段VML代码告诉客户端在屏幕上绘制一个尺寸为44像素的颜色为黑色的正方形。
在Win2000下用IE5打开:
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),它会将<v:fill method="QQQQ"/>这个数据域中的字符串(”QQQQ”)在未经长度限制的情况下复制到栈中。
IDA找到这个函数(符号表中没有函数的名字,只能根据地址直接定位):
网友评论