美文网首页
Heap Spray浅析:MS06-055(CVE-2006-4

Heap Spray浅析:MS06-055(CVE-2006-4

作者: BJChangAn | 来源:发表于2018-03-22 10:28 被阅读0次

    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找到这个函数(符号表中没有函数的名字,只能根据地址直接定位):

    0x02 poc页面

    相关文章

      网友评论

          本文标题:Heap Spray浅析:MS06-055(CVE-2006-4

          本文链接:https://www.haomeiwen.com/subject/vtsyoxtx.html