堆喷射中的问题

在CSDN上边讲解堆喷射的文章有很多,这里也就不再赘述,记录一下自己在看的过程中遇到的一些问题:
1、第一个问题其实就是比较简单的 什么是堆喷射?
事实上,对于堆喷射的概念一直没有一个统一的定义,大家都是通过对堆喷射的原理的理解进行自我解读的。我认为堆喷射就是,通过在堆中申请大量空间,将这段空间使用shellcode和滑板指令结合成的代码段进行填充,真样的话就会导致进程空间的大量地址被占用,之后再配合其它的攻击手段来控制程序的EIP,使程序执行到ShellCode上。
2、什么是滑板指令?滑板指令的作用是什么?
首先要清楚,我们的滑板指令是和我们的ShellCode结合形成一段代码段的,之后使用这段代码段来填充申请到的堆空间。
其次,当我们控制了EIP之后,目的是执行我们设计好的ShellCode,但是具体要怎么将EIP指向ShellCode这个过程没有办法做到那么精准。滑板指令的作用这个时候就发挥出来了:
1、滑板指令一般是nop指令或者类nop指令,所谓的类nop指令就是执行之后不会对我们执行ShellCode指令造成影响。
2、滑板指令其实对于ShellCode也起到一定的保护作用,防止造成Shell Code的破坏。所谓保护作用,用下图来解释
3、滑板指令的另一个作用就是增加ShellCode的命中率
3、怎么挑选滑板指令?
就如同我们上边所说,滑板指令再挑选方面其实就是一个要素,是空指令或者是类空指令,空指令:0x90 类空指令:0x0A0A0A0A,0x0C0C0C0C,0x0D0D0D0D 因此原则上来说只要是空指令或者是类空指令都可以成为我们的选择,具体要选择哪一个指令还得看其他要素
4、为什么一般挑选0x0c0c0c0c
上边说如何挑选滑板指令,事实上我们要覆盖到的地址,以及这个指令的自指向性都是我们考虑的要素,上边说的类空指令或者空指令只是滑板指令挑选的“门槛”。
这里说到指令的自指向,觉得有必要解释一下:
1、我们说的ShellCode和滑板指令组成的代码段在堆空间是怎样的分布状态:
在这里插入图片描述
在一段堆空间会有很多这样的代码段,而且从图上也可以很明显的看出滑板指令的大小比ShellCode的大小大很多,这是为什么呢?其实这样做是为了提高ShellCode的生存率,提高ShellCode的命中率,因为我们知道ShellCode必须命中ShellCode开始的第一条指令才能够正常工作,如果代码段分布是下边这种情况的话,反而不容易命中:
在这里插入图片描述
2、上边介绍了代码段在堆空间的分布状态,接下来我们说一下一般的触发堆喷射的方式(也是我在查阅各方资料中见到的最频繁的堆喷射的方式):通过覆盖虚表指针的方式来构造自指向,这里有必要说明一下虚函数的实现方式:
虚函数的实现方式:
虚函数是C++中的一种函数定义形式,虚函数(Virtual Function)是通过虚函数表(Virtual Table)来进行索引的,而这个虚函数表里边存放的是一个类的虚函数的地址表,靠着这张表可以解决继承、覆盖的问题。当然这不是重点,重点是虚函数的实现方式是依靠虚表进行索引的。当调用一个虚函数的时候,它的大致过程如下:
在这里插入图片描述
每一个class产生一堆指向虚函数的指针,放在表格之中。这个表格称之为虚函数表(virtual table,vtbl)
其实可以简单的把这个过程当作是一个数组的索引过程,这样就好理解的多。
我们上边说的自指向的意思就是借用虚函数实现的原理来实现的,具体过程如下:
在这里插入图片描述
我们把虚函数指针府改为0x0c0c0c0c,这个时候程序会跳转到0x0c0c0c0c的地址空间去执行相应的指令,而这个时候我们同样使用滑板指令0x0c0c0c0c去覆盖这段空间,就导致它指向自己,这个过程就是所谓的自指向。一直执行到我们的ShellCode就达成目的了
5、看好多文章都说覆盖200MB以上的内容,为什么?
上边解释了关于滑板指令的选取过程,到这里其实就好理解多了,我们知道在堆喷射中0x0c0c0c0c是一个臭名昭著的地址,我们可以计算一下,200M转换过来对应十六进制的C80 0000‬,如果我们堆喷射覆盖到200M以上的时候可以肯定的是一定会覆盖到0x0c0c0c0c这个地址的,所以才会说一般情况下覆盖到200M以上的内容
6、可能在堆喷射的时候,调试过程中可以运行,但是实际实现的时候不能成功,什么原因呢?
这个又可能是你处在调试状态下,调试的时候ShellCode指向都已经调整好了,但是有一个问题不能忽略,在调试模式和正常模式下,堆的管理策略是不一样的。调试堆与调试栈不同,不能直接用调试器 Ollydbg、Windbg 来加载程序,否则堆管理函数 会检测到当前进程处于调试状态,而使用调试态堆管理策略。
应该在程序开始的地方下断点,在程序断下来的时候再附加调试器,进行调试

总结:关于堆的这些问题最近一直在研究,但是限于资料比较少,所以很艰难,堆喷射找到的资料也比较少,个人水平有限,如果有错欢迎大家指正。同时还要感谢Dagger-axe-x的解惑

相关参考资料
https://blog.csdn.net/m0_46161993/article/details/104846792
https://blog.csdn.net/magictong/article/details/7391397

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值