HeapSpray原理演示

本文详细介绍了HeapSpray技术的工作原理及其应用实例。通过构造含有大量滑板指令的代码段并填充到进程的堆内存中,结合特定的漏洞攻击手段,使程序执行转向自定义的ShellCode,从而实现远程代码执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/magictong/article/details/7391397

 

演示Heap Spray(堆喷射)的原理 http://blog.youkuaiyun.com/lixiangminghate/article/details/53413863

### Java Heap Dump 的工作原理及生成机制 #### 1. **Heap Dump 定义** Heap Dump 是 JVM 在某一时刻内存使用情况的快照,它记录了当前堆中所有的对象及其引用关系。通过分析 Heap Dump 文件,开发人员可以深入了解应用程序的内存分配状况,识别潜在的内存泄漏问题以及优化内存使用效率。 这种文件通常用于调试和性能调优场景下,能够帮助开发者定位哪些对象占用了过多内存或者是否存在未释放的对象引用[^1]。 #### 2. **Heap Dump 的组成结构** Heap Dump 中主要包含了以下几类信息: - 对象实例:每个对象的具体数据。 - 类定义:描述这些对象所属的类元数据。 - 引用链路:展示不同对象之间的相互引用关系。 由于在生成过程中可能会触发 Full GC(全局垃圾回收),因此最终生成的 Heap Dump 可能不包含已经被标记为可回收的对象,从而减少了无关噪声的影响[^4]。 #### 3. **常见生成方式** ##### (a) 使用 `jmap` 工具 这是最常用的命令行工具之一来创建标准 `.hprof` 格式的堆转储文件。其基本流程包括两步——先确定目标进程 ID (`PID`) ,再利用该 PID 调用相应参数完成导出任务: ```bash # 查找Java应用对应的PID ps -ef | grep java # 或者更简洁地查看所有Java进程ID列表 jps -l # 导出heap dump到指定路径下的文件名 jmap -dump:live,format=b,file=/path/to/dumpfile.hprof <PID> ``` 上述指令中的 `-dump:live,...` 参数表示只捕获存活的对象;而如果不加此选项,则会连同那些即将被清理掉的数据也一并保存下来[^3]。 ##### (b) JVisualVM / MAT 等图形界面工具 除了命令行外,还有许多可视化管理平台可以直接连接远程服务端进行在线采集或是离线解析已有的 hprof 文件。例如 Oracle 提供的 VisualVM 就集成了多种监控功能于一体,并允许用户一键获取最新的 heap snapshot 数据。 另外像 Eclipse Memory Analyzer Tool(MAT),不仅擅长读取各种类型的 dump 文档,还提供了丰富的统计图表辅助理解复杂的内部状态变化趋势图谱等高级特性。 ##### (c) 自动化配置规则 对于生产环境而言,手动干预往往不够及时高效,为此可以通过设置特定条件自动触发展开过程。比如借助于 JVM 内置参数实现当 OOM 发生前即刻保留现场证据以便后续审查之需: ```properties -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/desired/location/ ``` 一旦检测到 OutOfMemoryException 即自动生成一份完整的 heap image 存放在预设目录位置等待进一步处理[^2]。 #### 4. **注意事项** 尽管 Heap Dumps 非常有用,但也存在一些局限性和风险需要注意: - 大型系统的 heap size 很大时,生成时间较长且占用额外磁盘空间; - 如果频繁操作可能会影响正常业务运行表现; - 不同版本之间兼容性可能存在差异等问题都需要提前规划好应对策略[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值