Windows系统溢出漏洞分析基础1
为了更加清晰了解缓冲区溢出的工作原理,先了解一下Win32系统内存结构以及函数调用时内存的工作原理。
在Win32的环境下,可以有高级的语言来编写程序的经过编译,链接,最终生成可执行文件也就是(PE)文件,这里就不详细展开说了
Win32系统中,按照进程使用的内存按照功能可以分为四个领域
1代码区:存放程序汇编后的机器代码和只读数据
2数据区用于储存全局变量和静态变量
3堆区:该区域内存由进程利用函数或者运算符动态申请
4栈区:该区域内存系统自动分配,用于动态储存之间的调用关系。
程序中使用的缓冲区可以是堆区可以是栈区,也可以是存放静态变量的数据区。
缓冲区溢出漏洞就是向缓冲区写入数据时,由于没有做边界检查,导致了写入缓冲区的数据都超过了预先分配的边界,从而使溢出的数据覆盖在和大数据上,而引起得系统异常
目前缓冲区溢出漏洞存在于各种操作系统比如Windows,linux等等
介绍栈的溢出之前先对栈在程序运行中重要作用介绍一下
1.函数的栈帧
(1)栈顿的概念
在程序设计中,栈通常是指一种后进先出(Last In First Out,LIFO)的数据结构,而入栈(Push)和出栈(Pop)则是进行栈操作的两种常见方法。为了标识栈的空间大小,同时为了更方便地访问栈中数据,栈通常还包括栈顶(Top)和栈底(Base)两个栈指针。栈顶指针随入栈和出栈操作而动态变化,但始终指向栈中最后入栈的数据;栈底指针指向先入栈的数据,栈顶和栈底之间的空间存储的就是当前栈中的数据。
(2)栈帧的标识
Win32 系统提供了两个特殊的寄存器来标识当前栈帧。
•ESP:扩展我指针Txrendea Stack Pointer)寄存器,其存放的指针指向当前栈帧的
栈顶。
EBP:扩展基址指针(Extended Base Pointer)
寄存器,其存放的指针指向当前栈帧的
栈底。显然,ESP与EBP之间的空间即为当前栈帧空间。
(3)栈帧中的内容
一个函数栈帧中主要包含以下信息。
1)前一个栈帧的栈底位置,即前栈帧EBP,用于在函数调用结束后恢复主调函数的栈帧(前栈帧的栈顶可计算得到)。
2)该函数的局部变量。
3)函数调用的参数。
4)函数的返回地址RET,用于保存函数调用前指令的位置,以便函数返回时能恢复军
周用前的代码区中继续执行指令。