0

Heartbleed バグをスタック オーバーフローと呼ぶのは正確でしょうか? 私の理解では、これは非常に典型的な例です。これは技術的に正しいですか?

4

3 に答える 3

4

ハートブリード バグは、スタック オーバーフローエラーではなく、一種のバッファ オーバーランエラーです。プログラムがスタック領域を使い果たすと、スタック オーバーフロー エラーが発生します。これは通常、クラッシュを引き起こし、直接悪用することはできません。

于 2014-04-11T20:46:41.257 に答える
3

スタックは、「後入れ先出し」を主な特徴とするデータ構造です。これにより、呼び出し元 (プログラムの一部) が情報をスタックに「プッシュ」し、最後にプッシュされたアイテムを「ポップ」できます。厳密なスタックの場合、他の操作は許可されません。

スタックは、プログラムがサブプログラムを呼び出すときに使用されます (関数、メソッド、サブルーチンはすべてサブプログラムであり、異なるコンテキストでは異なる名前を持ちます)。プログラムがサブプログラムを呼び出すとき、サブプログラムが戻ったときに利用できるように、一連の情報を保存する必要があります。したがって、この「実行コンテキスト」はスタックにプッシュされ、リターン時に取得されます。この操作はコンピュータにとって非常に重要であり、コンピュータ ハードウェアが直接サポートしています。言い換えれば、これを行うための機械語命令があるため、ソフトウェアで行う必要はありません (遅くなります)。

通常、コンピュータにはこのランタイム スタック専用のメモリ量があり、通常は、実行中の各プログラム用のスタックと、オペレーティング システム用のいくつかのスタックなどもあります。サブルーチン呼び出しが「深く」なり、スタック スペースの量が割り当てられたには、発生した呼び出しに必要なすべての情報が保持されません。これは、stackoverflow エラーです。

これは、心臓出血の問題ではありませんでした。これにより、外部プログラムは、返されるバッファ スペースの量を設定し、この外部プログラムが送信した少量のデータを超えて、たまたまメモリ内にあるものをすべて返すことができました。

したがって、質問に対する本当の答えは「いいえ」であり、これが典型的な例だと誰が考えたのか想像できません。

于 2014-04-11T20:57:44.980 に答える