web-dev-qa-db-ja.com

プログラミングにおけるスタックオーバーフローとヒープオーバーフローを例を挙げて説明しますか?

重複の可能性:
スタックオーバーフローエラーとは何ですか?

スタックオーバーフローとヒープオーバーフローが実際にプログラムで発生する方法と理由、およびプログラミングでスタックオーバーフローを克服する方法、つまりそれを回避する方法を誰かに教えてもらえますか?

16
mr_eclair

スタックオーバーフロー

_void stack_overflow(const char *x)
{
    char y[3];
    strcpy(y, x);
}
_

ヒープオーバーフロー

_void heap_overflow(const char *x)
{
    char *y = malloc(strlen(x));
    strcpy(y, x);
}
_

分析

両方の機能は、割り当てられたスペースを超えて踏みにじります。

stack_overflow("abc")を呼び出すと、4文字(nullを含む)が3文字に割り当てられたスペースにコピーされます。その後に何が起こるかは、損傷がどこで行われたかによって異なります。変数yはスタック上にあるため、スタックオーバーフローです。

heap_overflow()の呼び出し方法に関係なく、ヒープから1バイトが少なすぎることを要求し、最後を超えて書き込みます。それについて陰湿なのは、ヒープシステムが要求よりも多くのスペースを割り当てるため、一部の時間(ほとんどの場合でも)が機能しているように見えることです。ただし、制御データを踏みにじると、すべての賭けが無効になる可能性があります。

ヒープオーバーフローは非常に小さく、検出が困難です。スタックオーバーフローは小さい(渡された文字列が十分に短い場合は存在しない)場合もあれば、劇的な場合もあります。通常、割り当てられたスペースを超えて書き込むと、より劇的な効果が得られますが、割り当てられたスペースを超えて書き込むと、未定義の動作が発生します。何かが発生する可能性があります。

コピーするオブジェクトの大きさとそれを受け取るためのスペースの大きさを把握し、スペースよりも多くの資料をコピーしないようにすることで、問題がないことを確認します。いつも、毎回。

35

「スタックオーバーフロー」は「スタックベースのバッファオーバーフロー」とは異なります。前者は、停止しない再帰呼び出しなど、アクティブ化レコードが深すぎることが原因です。後者は、最も頻繁に悪用される脆弱性である不十分な境界チェックによるソフトウェアのバグです。

4
Infinite