HeapSpray原理演示

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值