2

バッファオーバーフロー、スタックオーバーフロー、ヒープオーバーフローについて読んでいました。私もこの投稿を読みました。私の質問はそのようなものです:コードでグローバル変数のみを使用する場合、オーバーフローのすべての悪用を防ぐと言えますか?

グローバルスコープで宣言されたコードにこのバッファがあるとしましょう:

char buf1[10];
char buf2[100];

buf1バッファとして送信する場合recv(int s, char *buf, int len,int flags);

  1. データセグメントを上書きして、buf2コンテンツを台無しにする可能性がありますよね?
  2. 私が知っているように、それはコードセグメントではなく、データセグメントは実行可能ではないので、そこからコードを実行できますか?

グローバルを使用することが最も安全な方法であると結論付けることができますか?

4

5 に答える 5

7

いいえ、まったくありません。スタック上のリターンアドレスなどを直接変更することは困難ですが、そのようなプログラムを破損したり、悪意を持って攻撃したりする可能性があります(バッファオーバーフローに注意がない場合)。

于 2012-04-09T17:03:51.337 に答える
3

オーバーフローのすべての悪用を防ぐと言えますか?

いいえ、グローバル変数はオーバーフローする可能性があります。

これをバッファとしてrecv(int s、char * buf、int len、int flags);に送信するとします。データセグメントを上書きしてbuf2コンテンツを台無しにする可能性がありますが、そこからコードを実行することはできません。私は正しいですか?グローバルを使用するのが最も安全な方法ですか?

いいえ、変数の保存期間は、オーバーフローできるかどうかには影響しません。

于 2012-04-09T17:04:32.443 に答える
3

バッファオーバーフローを回避する最善の方法は、静的バッファの使用を回避し、配列の代わりにSTLベクトルを使用するなど、メモリの割り当てが必要なオブジェクトにSTL、ブーストなどのライブラリを使用することです。

于 2012-04-09T17:08:55.117 に答える
2

データがどこにあるかは関係ありません。頑張れば外に書けます。スタックバッファオーバーランを使用してリターンアドレスを上書きし、バッファ内のコードを実行するかどうか。これはアーキテクチャに依存します。IMHO、スタックセグメント内のデータは実行可能であってはならず、実行しようとするとメモリ管理割り込みが発生するはずです。

スタック変数の代わりに「グローバル」を使用することは、些細なアプリを除いて、とにかく正しい解決策ではありません。

バッファクラス内の動的に割り当てられたバッファにデータをロードするだけなので、スタックバッファのオーバーランがアプリで問題になることはありません(さらに、バッファをオーバーランしません!)。

于 2012-04-09T17:12:16.330 に答える
2

スタック上のバ​​ッファは、スタックに沿ってさらにリターンアドレスと同じ場所に配置されるため、バッファオーバーランの脆弱性が存在します。最終的に、関数は戻る必要があり、そのアドレスを使用して実行を続行します。意図的にバッファを上書きすることにより、おそらく悪用者によって預けられたコードに、別の差出人アドレスを預けることができます。

確かに、グローバルバッファを使用すると、この特定の種類のエクスプロイトの可能性が低くなります。ただし、現在の操作の範囲外のデータに損傷を与えた結果としてアプリケーションが失敗する可能性を減らすことはできません。

グローバルデータにも欠点があり、包括的なソリューションではありません。したがって、最善のアプローチは、バッファがどこにあるかに関係なく、バッファオーバーランが発生しないようにコードを防御的に設計することです。

CとC++はどちらも安全なバージョンのバッファ機能を提供します。これらは、セキュリティの悪用に対する主要なガードとして優れた設計とともに使用する必要があります。

于 2012-04-09T17:09:30.917 に答える