私はそれに歴史があると仮定していますが、なぜスタックが下方に成長するのですか?
スタックが上向きになった場合、バッファオーバーフローを悪用するのははるかに困難になるように思えます...
私はそれに歴史があると仮定していますが、なぜスタックが下方に成長するのですか?
スタックが上向きになった場合、バッファオーバーフローを悪用するのははるかに困難になるように思えます...
回答:
メモリが非常に限られており、スタックで排他的に使用するためにメモリの大きなチャンクを事前に割り当てることは賢明ではなかったコンピューティングの非常に初期の時代から来ていると思います。したがって、ヒープメモリをアドレス0から上に割り当て、メモリの最後から下にスタックメモリを割り当てることにより、ヒープとスタックの両方で同じメモリ領域を共有できます。
もう少しヒープが必要な場合は、スタックの使用に注意してください。さらにスタックが必要な場合は、ヒープメモリを解放してみてください。スタックがヒープを上書きすることがあり、その逆の場合もあるため、結果はもちろん、ほとんどが壮観なクラッシュでした。
当時はインターウェブズがなかったため、バッファオーバーランの悪用の問題はありませんでした。(または、少なくともinterwebzが存在する限り、それはすべて米国国防総省の高度なセキュリティ施設内にあったため、悪意のあるデータの可能性をあまり考慮する必要はありませんでした。)
その後、ほとんどのアーキテクチャでは、同じアーキテクチャの以前のバージョンとの互換性を維持することがすべての問題でした。それが、逆さまのスタックが今日も私たちと一緒にいる理由です。
プログラムメモリは伝統的に次のように設定されています
code
constants
heap (growing up)
...
stack (growing down)
ヒープとスタックを交換できます
しかし、スタックが他の方向に進んだ場合、バッファオーバーフローは依然として悪用される
strcpy
例として古典を取り上げる
foo(char* in){
char[100] buff;
strcpy(buff,in);
}
スタックメモリとして
ret foo
arg in
buff array
ret strcpy
buf pointer
in
これは、コピーが行われたときの戻りアドレスがstrcpy
(の戻りアドレスではなく)バッファの後にあり、中にあるfoo
ものによって上書きできることを意味しますin
一部のハードウェアでは、ヒープがハイメモリで始まり、ダウンしていきますが、スタックはローメモリで始まります。
特にHPの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のTotally Invulnerableとしての評判は、単なるハードウェアデザインのフロックでしたか?