堆栈上的内存分配和缓冲区溢出,x86 ISA32

时间:2014-11-02 09:10:02

标签: c++ c memory-management x86

所以我一直在学习缓冲区溢出以及将内存保存到堆栈的过程,并且我一直困扰/我不理解某些约定。保存局部变量/数组时,为什么我们要将堆栈指针中的内存分配给基指针

(array [0]将更接近堆栈的顶部,数组[1]到数组[n-1]将更接近于帧的基本指针)

为什么不相反呢?如果将array [n-1]分配给堆栈指针,则不会对前一帧中保存的寄存器/返回地址构成威胁。

我已经阅读了wiki文章和成长部分的堆栈,但他们假设在分配缓冲区之前返回地址,这意味着缓冲区会覆盖返回。但不应该是相反的方式吗?只有在声明了局部变量之后,才能将返回地址写入堆栈中吗?

2 个答案:

答案 0 :(得分:2)

x86架构受到英特尔8080的严重影响,英特尔8080具有类似的堆栈架构(一个共享呼叫和数据堆栈向下增长)。当时这被认为是一个重大的进步,因为8080的前身8008有一个内置在CPU中的调用堆栈,只有七层深。

英特尔8080于1974年发布。鉴于没有很多东西被联网(例如,以太网刚刚开发),潜在的堆栈粉碎攻击可能不是主要问题。另一方面,灵活性和充分利用可用RAM是。

很久以后,堆栈粉碎成为一个主要问题。例如,first high-quality step-by-step guide于1996年出版。

答案 1 :(得分:1)

历史上,堆栈和堆占用了相同的内存空间。堆从底部分配,而堆栈从顶部分配。当你溢出......你只会覆盖其他空间内存并很快导致崩溃。

现在,我相信,它不再是这种情况,但是用于管理堆栈的x86指令集仍然存在,因此它从顶部消耗内存。

但是数组是从底部索引的。出于这个原因,array[0]更接近"顶部"堆栈(位于下方),array[n-1]距离更近。