栈溢出攻击基础

不知道有没有听说过缓冲区溢出,那什么是缓冲区溢出呢?缓冲区溢出就是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有进行边界检查,从而导致数据从小缓冲区溢出而冲掉了相邻内存区域的其它数据。缓冲区溢出是很常见的内存错误,攻击者入侵系统利用缓冲区溢出几乎可以做任何事情,因为成功利用缓冲区溢出漏洞不仅可以修改内存中变量的数据,还可以劫持进程,执行恶意代码,获取主机控制权。

我们要理解这一类攻击手法,那就有必要了解一下计算机体系架构,CPU,寄存器,内存等知识。Windows系统程序运行时内存可以分为四个部分:

1.代码区,.text区段,这个区域存储着被装入的二进制机器代码。

2.数据区,.data区段,存储全局变量。

3.堆区,一个进程可以在堆区动态地申请一定大小的内存,用完之后再还给堆区。

4.栈区,用于动态地存储函数之间的调用关系,传递参数,保存函数返回地址。

我们这里介绍的是栈溢出,所以先介绍一下栈的结构(堆溢出攻击与栈溢出攻击完全不同,注意一下)。

栈是一种数据结构,是一种先进后出的数据表,有两种操作:出栈pop和入栈push,栈的标识也有两个:栈顶top和栈低base。系统中也有一个系统栈,与普通栈一样,系统栈由系统维护,主要用于实现高级语言中函数的调用。程序中各个函数的跳转都是与系统栈结合完成的,当一个函数被调用的时候,系统栈会给这个函数开辟一个新的栈帧,把它压入栈中。栈帧中的内存空间被所属的函数独占,一般情况下不会和其它函数共享,当函数返回时,系统栈会弹出该函数的栈帧。

每一个函数独占自己的栈帧空间,当前正在运行的函数栈帧总是在栈顶,汇编中有两个寄存器与栈相关:

1.esp,栈指针寄存器,extended stack pointer,存放一个指针,指向系统栈最上面一个栈帧的栈顶。

2.ebp,基址指针寄存器,extended base pointer,存放一个指针,指向系统栈最上面一个栈帧的栈底。

注意一下栈帧底部和栈底是两个不同的概念:

栈低:系统栈的底部。

栈帧底部:系统栈最上面那个栈帧的底部。

在函数栈帧中一般包含了几类信息:

1.局部变量。

2.栈帧状态值。

3.函数返回值。

还有一个寄存器需要注意一下,那就是eip寄存器,extended instruction pointer,也就是指令寄存器,里面存放着一个指针,一直指向下一条要执行的指令地址。可以说控制了eip就控制了进程。

接下来我们还要了解一下函数调用约定,不同的约定的函数传递参数的方式是不一样的,包括参数传递方式,参数入栈顺序,堆栈谁来平衡。

1._cdecl调用约定,参数入栈从右到左,调用者负责平衡堆栈。

2._fastcall调用约定,参数入栈从右到左,被调用者负责平衡堆栈。

3._stdcall调用约定,参数入栈从右到左,被调用者负责平衡堆栈。

要选择哪一种调用约定的话,只需要在函数前面写上就OK了,一般vc使用_stdcall调用约定,win32 API也是使用_stdcall,但是c语言运行库函数使用的是_cdecl调用约定。可能还有一些其它的不同,比如c++类成员的this指针在Windows下面有ecx寄存器传递,而gcc编译器会将这个指针做最后一个参数入栈。

函数调用主要分为几个步骤:

1.参数入栈,入栈顺序看调用约定。

2.返回地址入栈,就是将跳转指令的下一条指令的地址压入栈中,也好函数返回是继续执行下去。

3.代码区跳转,从当前代码处跳转去被调用函数入口处执行函数。

4.调整栈帧,保存当前栈帧状态值ebp,将当前栈帧切换到函数栈帧(mov ebp,esp),为函数栈帧分配空间(sub esp,0x0000)。

我们看一个有栈缓冲区溢出的例子。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值