Heap Spray:堆与栈的协同攻击
1:应用场景
在针对浏览器的攻击中,常常会结合使用堆和栈协同利用漏洞。
(1)当浏览器或其使用的ActiveX 控件中存在溢出漏洞时,攻击者就可以生成一个特殊的HTML
文件来触发这个漏洞。
(2)不管是堆溢出还是栈溢出,漏洞触发后最终能够获得EIP。
(3)有时我们可能很难在浏览器中复杂的内存环境下布置完整的shellcode。
(4)页面中的JavaScript 可以申请堆内存,因此,把shellcode 通过JavaScript 布置在堆中
成为可能。
2:原理
在使用Heap Spray 的时候,一般会将EIP 指向堆区的0x0C0C0C0C 位置,然后用JavaScript
申请大量堆内存,并用包含着0x90 和shellcode(1M内存的尾部) 的“内存片(1M)”覆盖这些内存。
通常,JavaScript 会从内存低址向高址分配内存,因此申请的内存超过200MB(200MB=200
×1024×1024 = 0x0C800000 > 0x0C0C0C0C)后,0x0C0C0C0C 将被含有shellcode 的内存片覆
盖。只要内存片中的0x90 能够命中0x0C0C0C0C 的位置,shellcode 就能最终得到执行。
1M内存片
3:解释
1:为什么用0x0c0c0c0c而不是更小的位置?
因为堆的增长方向是想高地址,所以,越高的地址在申请之前被程序占用的可能性小。
2:为什么是200M?
200MB=200×1024×1024 = 0x0C800000 > 0x0C0C0C0C
4:MSF中的相关js代码
var nop=unescape("%u9090%u9090");
while (nop.length<= 0x100000/2)
{
nop+=nop;
}//生成一个1MB 大小充满0x90 的数据块
nop = nop.substring(0, 0x100000/2 - 32/2 - 4/2 - shellcode.length - 2/2 );
var slide = new Arrary();
for (var i=0; i<200; i++)
{
slide[i] = nop + shellcode
}