(-gフラグを使用してコンパイルした後)gdbでC / C ++プログラムを実行し、特定の変数、引数などのアドレスを調べてから、(を使用して./
)gdbの外部で実行すると、これらのアドレスはgdbで見たものと同じですか?それらが異なる場合、それらは通常類似していますか、それとも大幅に異なりますか?
gdbで完全に機能する(ブレークポイントの有無にかかわらず)バッファオーバーフロープログラムがあるため、これを尋ねますが、gdbの外部で実行しようとすると機能しません。
(-gフラグを使用してコンパイルした後)gdbでC / C ++プログラムを実行し、特定の変数、引数などのアドレスを調べてから、(を使用して./
)gdbの外部で実行すると、これらのアドレスはgdbで見たものと同じですか?それらが異なる場合、それらは通常類似していますか、それとも大幅に異なりますか?
gdbで完全に機能する(ブレークポイントの有無にかかわらず)バッファオーバーフロープログラムがあるため、これを尋ねますが、gdbの外部で実行しようとすると機能しません。
特定の変数、引数などのアドレスを調べてから、gdbの外部で実行します(./を使用)。これらのアドレスは、gdbで見たものと同じになります。
場合によります。
-fpie
、リンクされている場合を除く)。-pie
Linux上のGDBは、デバッグを容易にするために、デフォルトでASLRを無効にすることに注意してください。を使用して、GDBでASLRを再度有効にすることができますset disable-randomization off
。これにより、GDBで問題を再現できる場合があります。
バッファオーバーフローがあります
また、 ValgrindやAddress Sanitizerなどのツールは、GDBで実行するよりも、バッファオーバーフローを見つけるのに非常に効果的である場合が多いことにも注意してください。特にAddressSanitizerは、グローバルおよびスタックでバッファオーバーフローを検出するという点で優れています(Valgrindは検出しません)。
特定のコードまたは変数が固定された場所に配置されると思い込まないでください。
これは過去のほとんどのOSに当てはまりましたが、これはセキュリティホールです。悪意のあるソフトウェアはこれを使用してプログラムを活用します。OSは、セキュリティを強化するためにアドレスをスクランブルする傾向があります。
フラグを使用してコンパイルすると-g
、実行可能ファイルの追加情報にぶつかり、コードサイズが大きくなります。
バッファの問題に関しては、問題が発生している場所にコードのスニペットを公開すると便利です。