12

(-gフラグを使用してコンパイルした後)gdbでC / C ++プログラムを実行し、特定の変数、引数などのアドレスを調べてから、(を使用して./)gdbの外部で実行すると、これらのアドレスはgdbで見たものと同じですか?それらが異なる場合、それらは通常類似していますか、それとも大幅に異なりますか?

gdbで完全に機能する(ブレークポイントの有無にかかわらず)バッファオーバーフロープログラムがあるため、これを尋ねますが、gdbの外部で実行しようとすると機能しません。

4

3 に答える 3

11

特定の変数、引数などのアドレスを調べてから、gdbの外部で実行します(./を使用)。これらのアドレスは、gdbで見たものと同じになります。

場合によります。

  1. メインの実行可能ファイルで定義されたグローバル変数は同じアドレスに留まります(実行可能ファイルがフラグで構築され-fpie、リンクされている場合を除く)。-pie
  2. 他の共有ライブラリで定義されたグローバル変数は、 ASLRのために大幅に異なるアドレスを持つ可能性があります。
  3. ASLRにより、ローカル変数とパラメーターが数Kバイト移動する場合があります。
  4. ASLRが原因で、またはプログラムがマルチスレッドである場合、ヒープに割り当てられた変数も大幅に移動する可能性があります。

Linux上のGDBは、デバッグを容易にするために、デフォルトでASLRを無効にすることに注意してください。を使用して、GDBでASLRを再度有効にすることができますset disable-randomization off。これにより、GDBで問題を再現できる場合があります。

バッファオーバーフローがあります

また、 ValgrindAddress Sanitizerなどのツールは、GDBで実行するよりも、バッファオーバーフローを見つけるのに非常に効果的である場合が多いことにも注意してください。特にAddressSanitizerは、グローバルおよびスタックでバッファオーバーフローを検出するという点で優れています(Valgrindは検出しません)。

于 2012-04-08T15:20:39.060 に答える
2

特定のコードまたは変数が固定された場所に配置されると思い込まないでください。

これは過去のほとんどのOSに当てはまりましたが、これはセキュリティホールです。悪意のあるソフトウェアはこれを使用してプログラムを活用します。OSは、セキュリティを強化するためにアドレスをスクランブルする傾向があります。

于 2012-04-08T08:38:33.517 に答える
0

フラグを使用してコンパイルすると-g、実行可能ファイルの追加情報にぶつかり、コードサイズが大きくなります。

バッファの問題に関しては、問題が発生している場所にコードのスニペットを公開すると便利です。

于 2012-04-08T08:34:27.367 に答える