这与问题'Why do stacks typically grow downwards?'有关,但从安全 Angular 来看更多。我通常指的是x86。
当缓冲区通常被向上写入内存时,堆栈会向下增长,这让我感到奇怪。例如,典型的C++字符串的结尾处的内存地址比开头的地址高。
这意味着,如果存在缓冲区溢出,那么您将进一步覆盖调用堆栈,据我所知这是安全隐患,因为它打开了更改返回地址和局部变量内容的可能性。
如果堆栈在内存中向上增长,缓冲区溢出会不会简单地运行到死内存中?这样会提高安全性吗?如果是这样,为什么还没有完成呢?那么x64,那些堆栈会向上增长吗?如果不是,为什么呢?
最佳答案
从技术上讲,这取决于OS / CPU,但这通常是因为堆栈和堆沿相反的方向且从地址空间的相反两端增长。
这种安排为您提供了最大的灵活性,可以在堆和堆栈之间分配/分配内存,而不会造成冲突。如果它们都朝着相同的方向增长,那么您需要为堆栈设置一个起始地址,这将对堆的最大大小进行硬限制(并对堆栈的大小进行硬限制)
预计到达时间:
找到了一个interesting piece on wikipedia,说明为什么使堆栈向上生长并不一定防止堆栈溢出-只是使它们的工作有所不同。