• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

在《C语言程序的内存布局(内存模型)》中,我们提到了一个程序的虚拟地址空间被分成若干个区域,堆栈就是地址较高的区域。Stack可以在函数内部存储函数参数、局部变量、局部数组等数据,其目的是完成函数的调用。

堆栈内存由系统自动分配和释放:当函数调用发生时,为函数运行中使用的数据分配内存,函数调用结束后,之前分配的内存全部销毁。因此,局部变量和参数只在当前函数中有效,不能在函数外传递。

栈的概念

在计算机中,堆栈可以理解为一个特殊的容器。用户可以依次将数据放入堆栈,然后以相反的顺序从堆栈中取出数据。也就是说,先放进去的数据只能最后取出,而最后放进去的数据必须先取出。这就是所谓的先进后出原则。

放入数据常被称为Push,取出数据常被称为Pop。如下图所示:

amov1dw41it2572.png

可以发现栈底一直不动,栈顶只在栈出和栈入的时候动。当堆栈中没有数据时,堆栈的顶部和底部重合。

栈本质上是一个连续的内存,需要同时记录栈底和栈顶,才能定位当前栈。在现代计算机中,ebp寄存器通常用于指向堆栈的底部,而esp寄存器用于指向堆栈的顶部。随着数据进出栈,esp的值会不断变化,入栈时esp的值减小,出栈时esp的值增大。

Ebp和esp都是CPU中的寄存器:ebp是Extend Base Pointer的缩写,通常用来指向栈底;Esp是Extend Stack Pointer的缩写,通常用来指向栈顶。

下图显示了一个堆栈示例:

h0vlth5z3xp2573.png

栈的大小以及栈溢出

对于每个程序来说,堆栈可以使用的内存是有限的,通常是1M~8M,这是在编译时就已经决定的,在程序运行过程中是不能改变的。如果程序使用的堆栈内存超过最大值,就会出现堆栈溢出错误。

一个程序可以包含多个线程,每个线程都有自己的堆栈。严格来说,栈的最大值是针对线程的,不是针对程序的。

堆栈内存的大小与编译器有关,编译器会指定堆栈内存的最大值。在VC/VS下,缺省值是1M,在C-Free、2M下,在Linux GCC下,缺省值是8M。

当然,我们也可以通过参数来修改堆栈内存的大小。以VS2010为例。右键单击项目名称,会弹出一个菜单。选择属性,会出现一个对话框,如下图所示:

24k2e003wcc2574.png

在这个图中,我们将堆栈内存设置为4M。提示:stack经常被称为stack,而heap仍然被称为heap,所以Stack的概念不包括heap,所以要注意区分。

当程序使用的堆栈内存大于默认值(或修改值)时,就会出现堆栈溢出错误。使用VS2010并切换到调试模式,然后运行以下代码:

int main(){

char str[1024 * 1024 * 2]={ 0 };

返回0;

}

本地字符数组str存储在堆栈上,占用内存2M,超过默认值1M,所以会出现堆栈溢出错误,如下图所示:

q1tvbjqhvli2575.png

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now