漏洞利用exploit ——跳板技术 静待春暖花开之时,你我相见 听你说一声 好久不见

expolit指的是漏洞利用的过程,一般一一段代码的形式出现。exploit的核心功能是淹没函数的返回地址,获取进程的控制权限
关于shellcode前边已经做过相关的介绍,那么shellcode和exploit二者之间有什么联系呢?其实二者在本质上是没有任何联系的但是二者又息息相关,我们知道exploit的核心功能就是提权(getshell),而shellcode就是我们在提权之后要执行的命令,但是exploit只管提权不管提权之后要干什么,而shellcode则只管提权之后的命令执行不管是否提权,所以说这二者互不相干又息息相关。

我们所说的跳板技术其实是一种动态定位shellcode的方法,当然与之相对应的还有静态定位shellcode 的方法,前边在对shellcode进行介绍的时候,也并没有对shellcode的定位进行介绍,这里就对这两种方法简单的进行介绍:

静态定位shellcode

以缓冲区溢出为例:我们所说的静态定位方法就是在动态调试程序的时候,计算出函数在执行过程中的返回地址,然后利用缓冲区溢出的原理将原来的函数返回地址覆盖成为另一个地址,而这个地址就是shellcode存放的地址。这个过程就是静态定位shellcode的方法。这种方法便于理解但是有一个不可避免的弊端:在每次程序重新装载的时候,缓冲区的起始地址和函数的返回地址都可能会发生变换,因此,在这种静态定位shellcode的方法中,很容易导致函数返回地址的覆盖错误,导致程序跳向未知数据的地方导致程序运行出错
静态定位shellcode的过程如下图所示:
在这里插入图片描述
***题外话:***需要注意的是,shellcode的开发,不同于普通意义上的开发,shellcode的开发,需要在不断地动态调试的过程中去改进,不管是代码的体量还是代码插入的位置,都需要经过一番思量,而且在不同编译器的优化下动态调试的过程也不尽相同,因此,shellcode的学习和开发需要在查阅资料和自己动手调试的基础上共同进行才能对整个过程以及原理更清晰的掌握

跳板技术

之所以会使用到跳板技术是因为在静态定位shellcode 的过程中,我们需要将函数的返回地址覆盖成为shellcode的地址,但是(还是以缓冲区溢出为例),我们的shellcode是填充在缓冲区内部(或者其他数据空间里边),而且我们在填充shellcode的时候,该地址是被硬编码了的,在下一次程序重新装载之后,我们的缓冲区的地址就会发生变化,也就是我们常说的“帧移位”,这个时候再按照之前的硬编码数据进行地址覆盖的时候,就会造成程序EIP 指向其他数据导致程序无法正常运行(程序奔溃),为了解决这个问题,提出了跳板技术进行shellcode的动态定位。
要实现shellcode的动态定位,也就是说不管什么时候我们都能找到一个不变的量,以此为依据才能进一步找到shellcode的位置。

这里介绍一种情况下的跳板寻找:以jmp esp为跳板,具体实现过程如下:
1:将函数返回地址处的指令修改为jmp esp的地址(也就是将函数的返回地址重定向)(一般情况下,ESP 寄存器中的地址总是指向系统栈中且不会被溢出的数据破坏。函数返回时,ESP 所指的位置恰好是我们所淹没的返回地址的下一个位置),当然也可以修改为其他指令,这就需要在shellcode的开发过程中自己去调试获得这个不变的量或者是变化有规律的量
2:跳转指令jmp esp执行之后,开始将之后的地址空间覆盖为shellcode,这样再jmp esp指令执行过后,就会跳到shellcode的空间。如下图所示
在这里插入图片描述
那么现在还有一个问题需要解决,那就是用来重定向返回地址的地址从何而来也就是说jmp esp这个指令的地址从哪来,这个其实相对比较好解决,在程序装载的时候会加载一些模块到内存空间去,我们可以在内存空间里边直接搜索这个指令的机器码 0xFFE4就可以了,可以自己编写程序实现,也可以通过OD来动态调试的过程中找到相应指令的地址,但是需要注意的一点是,这个跳转指令在一定程度上需要有通用性才比较使用,当我们采用跳板的方式来定位shellcode的时候就希望能够在极大程度上减轻压力,因此通用性也是一个需要考虑的因素,在不同的操作系统和不同的版本里边,一个模块(主要指常见的动态链接库)里边指令的地址是不一样的,所以选择的时候也要多加注意。

这样跳板的地址找到之后,就可以进行动态定位shellcode了,定位到shellcode之后就可以开始为所欲为了(当然前提是插入有效能够实现功能的shellcode代码)

当然除此之外还有其他的情况发生 比如说,在一些判断条件比较严格的漏洞里边,我们用跳板来定位shellcode 很难做到,但是静态定位的方法又不准确那这个时候我们使用什么方法呢?
下边介绍两种思路,
第一种就是增加我们“靶子”的面积,所谓“靶子”是指shellcode所处的内存区域,我们可疑淹没一大片的内存区域,将前边的内存区域都覆盖为nop指令,而把真正的shellcode放在后边,这样,只要返回地址在nop指令的区域里,就可以执行我们的shellcode指令,如下图所示:
在这里插入图片描述
第二种:增加“扫射面积”
我们说的增加扫射面积。其实和上边的增加“靶子面积”大同小异,不同的是,这种方法采用的是多个返回地址来覆盖真正的返回地址,以此来增加命中的几率,如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值