堆栈为什么不向上增长(为安全起见)?

Ash*_*ain 28 architecture security cpu x86 stack

这与"为什么堆栈通常会向下生长?"这个问题有关.,但从安全的角度来看更多.我通常指的是x86.

当缓冲区通常在内存中向上写入时,堆栈会向下增长,这让我觉得很奇怪.例如,典型的C++字符串的结尾位于比开头更高的内存地址.

这意味着如果存在缓冲区溢出,则会进一步覆盖调用堆栈,我理解这是一种安全风险,因为它可以更改返回地址和本地变量内容.

如果堆栈在内存中向上增长,那么缓冲区溢出会不会简单地运行到内存中?这会提高安全性吗?如果是这样,为什么还没有这样做?那么x64,那些堆栈是否会增长,如果不是,为什么不呢?

Eri*_*lje 25

从技术上讲,这取决于OS/CPU,但通常这是因为堆栈和堆在相反的方向和地址空间的相对端生长.

这种安排使您可以最灵活地在堆和堆栈之间拆分/分配内存,而不会导致它们发生冲突.如果它们都是朝着相同的方向增长,那么你需要有一个堆栈的起始地址,它将硬限制堆的最大大小(以及对堆栈大小的硬限制)

ETA:

在维基百科上发现了一个有趣的文章,关于为什么使堆栈增长不一定会阻止堆栈溢出 - 它只是使它们的工作方式有所不同.

  • 我每天都访问stackoverflow,但堆栈流量并不是那么多.所以我猜堆栈溢出更严重 - :) (8认同)