web-dev-qa-db-ja.com

スタックオーバーフローとバッファオーバーフローの違いは何ですか?

プログラミングでのスタックオーバーフローとバッファオーバーフローの違いは何ですか?

61
joe

スタックオーバーフローは、実行スタックが予約されているメモリを超えて増大する場合を具体的に示します。たとえば、終了せずに再帰的にそれ自体を呼び出す関数を呼び出すと、各関数呼び出しで新しいスタックフレームが作成され、スタックは最終的に予約されているよりも多くのメモリを消費するため、スタックオーバーフローが発生します。

バッファーオーバーフローとは、プログラムが任意のバッファーに割り当てられたメモリの末尾を超えて書き込む場合を指します(スタック上だけでなく、ヒープ上を含む)。たとえば、ヒープから割り当てられた配列の末尾を超えて書き込むと、バッファオーバーフローが発生します。

128
Nick Meyer

重要な違いは、スタックとバッファの違いを知ることです。

スタックは、実行中のプログラムを実行するために予約されているスペースです。関数を呼び出すと、そのパラメーターと戻り情報がスタックに配置されます。

バッファは、単一の目的で使用される一般的なメモリの塊です。たとえば、文字列はバッファです。割り当てられたよりも多くのデータを文字列に書き込むと、オーバーランする可能性があります。

18
Craig

スタックオーバーフロー:現在のスレッドに割り当てられたメモリに対して、スタック上に多くのものを配置しすぎた

バッファオーバーフロー:現在割り当てられているバッファのサイズを超えており、収まるようにサイズ変更していません(またはそれ以上サイズ変更できません)。

11
Chris Ballance

あなたがおそらくここで知りたいこと以上のもの:

スタックオーバーフロー

バッファオーバーフロー

11
Dana Holt

スタックオーバーフローとは、スレッドのスタックサイズがそのスレッドの最大許容スタックサイズを超える場合です。

バッファオーバーフローとは、プログラムによって現在割り当てられていない値がメモリに書き込まれる場合です。

5
JaredPar

バッファオーバーフローは、通常、スタックまたはヒープに関係なく、メモリバッファが境界を超えてアクセスされるたびに発生します。スタックオーバーフローとは、スタックが割り当てられた制限を超えており、ほとんどのマシン/ OSがヒープ上で実行されていることを意味します。

3
kenny

「スタックとバッファの違いは何ですか」と言うつもりはありませんか? -これにより、より迅速に洞察を得ることができます。ここまで進んだら、これらの各項目をオーバーフローさせることの意味を考えることができます。

3
Ether

1。スタックベースのバッファオーバーフロー•プログラムが、目的のデータ構造(固定長バッファ)の外側のプログラムの呼び出しスタック上のメモリアドレスに書き込むときに発生します。 •スタックベースのプログラミングの特徴1.「スタック」は、自動変数が割り当てられるメモリ空間です。 2.関数パラメーターはスタックに割り当てられ、システムによって自動的に初期化されないため、初期化されるまでガーベッジがあります。 3.関数のサイクルが完了すると、スタック内の変数への参照が削除されます。 (つまり、関数が複数回呼び出された場合、そのローカル変数とパラメーターは、関数が呼び出されて終了するたびに再作成および破棄されます。)
•攻撃者は、スタックベースのバッファオーバーフローを悪用して、上書きによってさまざまな方法でプログラムを操作します。
1。攻撃者に利益をもたらす可能性のあるプログラムの動作を変更するための、スタック上のメモリ内のバッファの近くにあるローカル変数。
2。スタックフレームのアドレスを返します。関数が戻ると、攻撃者によって指定された戻りアドレス(通常はユーザー入力で満たされたバッファー)で実行が再開されます。 3.後に実行される関数ポインターまたは例外ハンドラー。 •エクスプロイトを克服する要因は次のとおりです。
1。アドレスのNullバイト2.シェルコードの場所のばらつき3.環境間の違いシェルコードは、ソフトウェアの脆弱性の悪用に使用される小さなコードです。

2。ヒープバッファオーバーフロー

•ヒープデータ領域で発生します。 •オーバーフローが発生するのは、アプリケーションがバッファに含まれるように設計されたよりも多くのデータをバッファにコピーした場合です。 •最初にソースが宛先に適合することを確認せずにデータをバッファにコピーすると、悪用される可能性があります。 •スタックベースおよびヒープベースのプログラミングの特徴:•「ヒープ」は、動的オブジェクトが割り当てられたときのメモリ空間である「フリーストア」です。 •ヒープは、new()、malloc()、およびcalloc()関数が動的に割り当てられたメモリ空間です。 •動的に作成された変数(つまり、宣言された変数)は、実行前にヒープ上に作成され、オブジェクトのライフサイクルが完了するまでメモリに保存されます。 •エクスプロイトが実行されます。•データを破損して、リンクリストポインターなどの内部構造をオーバーライドします。 •プログラム機能をオーバーライドするポインター交換

2
Uday Moradiya

バッファオーバーフローに言及するほとんどの人は、スタックオーバーフローを意味します。ただし、オーバーフローはスタックだけに限らず、どの領域でも発生する可能性があります。ヒープやbssなど。スタックオーバーフローは、スタック上のリターンアドレスの上書きに制限されますが、リターンアドレスを上書きしない通常のオーバーフローは、おそらく他のローカル変数を上書きするだけです。

0
user961124

RAMの図を使用して、より簡単な方法で説明します。それに飛び込む前に、StackFrame、ヒープメモリについて読むことをお勧めします。

ご覧のように、スタックがスタックであると仮定すると、スタックは下向きに成長します(矢印で表示)。カーネルコード、テキスト、データはすべて静的データであるため、修正されています。動的なヒープ部分は上向きに成長します(矢印で表示)。

enter image description here

0
Uddhav Gautam