2012-04-09 9 views
2

バッファ、スタック、ヒープオーバーフローについて読んでいました。私はこれもpostと読んでいます。私の質問は、私のコードでグローバル変数だけを使用すると、オーバーフローの悪用をすべて防ぐことはできますか?グローバル変数を使用したプログラムの作成はより安全ですか?

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

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

私はrecv(int s, char *buf, int len,int flags);

  1. にバッファとしてbuf1を送信する場合、私はデータセグメントを上書きすると台無しにしますbuf2コンテンツですか?
  2. 私はそれがコードセグメントではなく、データセグメントが実行可能ではないことを知っているので、コードを実行できますか?

Globalsを使用するのが最も安全な方法であると結論できますか?

+15

最も安全な方法は、バッファをオーバーランさせることではありません。 –

+12

IMO、これはあなたが年を取ったときに癌で死ぬことを防ぐために25歳のときに自殺することとほぼ同じです。 –

+0

'len'に適切な値を渡す限り、あなたのバッファはまったくオーバーフローしません。 *これは難しい概念ではありません。 –

答えて

2

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

スタック変数の代わりに 'globals'を使用することは、とにかく簡単なアプリを除いてはまったく問題がありません。

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

7

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

3

私はそれがオーバーフローのすべての悪用を防ぐことができますか?

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

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

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

3

バッファオーバーフローを避ける最良の方法は、静的バッファの使用を避け、memeoryの割り当てが必要なオブジェクトの場合はSTL、boostなどのライブラリを使用することです。

2

スタック上のバ​​ッファとスタックに沿ったリターンアドレスが同じ場所にあるため、バッファオーバーランの脆弱性が存在します。最終的に関数は返さなければならず、そのアドレスを使用して実行を続行します。意図的にバッファを上書きすることによって、おそらくエクスプロイタによって預けられたコードに、異なるリターンアドレスを預けることができます。

確かにグローバルバッファを使用すると、この特定の種類の悪用の可能性が減ります。ただし、現在の操作の範囲外のデータを破損したためにアプリケーションの障害が発生する可能性は低くなりません。

グローバルデータにも欠点があり、包括的な解決策ではありません。したがって、バッファがどこにあるかにかかわらず、バッファオーバーランが発生しないように、コードを防御的に設計するのが最善の方法です。

CおよびC++の両方とも、バッファ機能の安全なバージョンを提供しています。これらは、セキュリティの悪用に対するプライマリガードとして、優れた設計と一緒に使用する必要があります。

関連する問題