我假设有历史,但是堆栈为什么向下增长?
在我看来,像缓冲区溢出将是一个很大很难利用如果堆栈向上增长...
我假设有历史,但是堆栈为什么向下增长?
在我看来,像缓冲区溢出将是一个很大很难利用如果堆栈向上增长...
Answers:
我认为它来自计算的早期,那时内存非常有限,因此预先分配大量内存供堆栈专用是不明智的。因此,通过从地址零开始向上分配堆内存,并从内存末尾向下分配堆栈内存,可以使堆和堆栈共享相同的内存区域。
如果您需要更多的堆,则可以谨慎使用堆栈。如果需要更多堆栈,可以尝试释放一些堆内存。结果当然是导致崩溃的主要原因,因为堆栈偶尔会覆盖堆,反之亦然。
那时,还没有interwebz,因此就没有缓冲区溢出漏洞利用的问题。(或者至少在存在interwebz的程度上,它们全都在美国国防部的高安全性设施之内,因此无需考虑恶意数据的可能性。)
此后,对于大多数体系结构来说,都是保持与同一体系结构以前版本的兼容性。这就是为什么今天我们仍然需要颠倒的堆栈。
某些硬件的堆从高内存开始增长,然后逐渐减少,而栈从低内存开始增长。
惠普的PA-RISC硬件以及其他功能可以做到这一点:http : //www.embeddedrelated.com/usenet/embedded/show/68749-1.php
久负盛名的Multics操作系统在具有(可能是其中之一)堆栈增长的硬件上运行:请参阅http://www.acsac.org/2002/papers/classic-multics.pdf,第2.3.2节结尾:
第三,Multics处理器上的堆栈朝着正方向而非负方向增长。这意味着,如果您实际上完成了缓冲区溢出,则将覆盖未使用的堆栈帧,而不是您自己的返回指针,从而使利用变得更加困难。
这是一个非常有趣的声明。缓冲区溢出是否仅由于“常规”过程-调用-堆栈-框架安排而成为如此巨大的问题?另外,Multics的“完全无敌”声誉仅仅是硬件设计的fl幸?