(一)什么是缓冲区
Windows系统的内存结构如图2-118所示。在计算机运行时将内存划分为3个段,分别是代码段、数据段和堆栈段。
图2-118 Windows系统的内存结构
1.代码段
数据只读,可执行。代码段存放了程序的代码,在代码段中的数据是在编译时生成的二进制机器代码,可供CPU执行,在代码段一切数据不允许更改。任何尝试对该区的写操作都会导致段违法出错。
2.数据段
静态全局变量,位于数据段,并且在程序开始运行的时候被加载。
3.堆栈段(www.daowen.com)
放置程序运行时动态的局部变量,局部变量的空间被分配在堆栈里面。
堆栈是一个后进先出(Last In First Out,LIFO)的数据结构,往低地址增长,保存本地变量、函数调用等信息。随着函数调用层数的增加,栈帧是遂块地向内存低地址方向延伸的,随着进程中函数调用层数的减少,即各函数的返回,栈帧会逐块地被遗弃,而向内存的高地址方向回缩。各函数的栈帧大小随着函数性质的不同而不等。
缓冲区是一块连续的计算机内存区域。在程序中,通常把输入数据存放在一个临时空间内,这个临时存放空间被称为缓冲区,也就是所说的堆栈段。
(二)什么是缓冲区溢出
如果把1L的水注入容量为0.5L的容器中,水就会四处溢出。同理,在计算机内部,如果向一个容量有限的内存空间里存储过量数据,这时数据也会溢出存储空间。
在程序编译完以后,缓冲区中存放数据的长度事先已经被程序或者操作系统定义好,如果往程序的缓冲区写超出其长度的内容,就会造成缓冲区的溢出,覆盖其他空间的数据,从而破坏程序的堆栈,使程序转而执行其他指令。
根据被覆盖数据的位置的不同,缓冲区溢出分为静态存储区溢出、栈溢出和堆溢出等3种。这里只关心动态缓冲区的溢出问题,即基于堆栈的缓冲区溢出。下面将通过调试一个简单的溢出实例来讲解Windows缓冲区溢出的机制。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。