2012-04-08 30 views
7

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

私はgdbの中で(ブレークポイントの有無にかかわらず)完全に動作するバッファオーバーフロープログラムを持っているので、これを聞いていますが、gdbの外で実行しようとするとうまくいきません。

+4

バッファオーバーフローについては、valgrindを試すことをおすすめします。 – Troubadour

+1

"ulimit -c unlimited"を指定してプログラムを強制的にコアダンプし、gdbでコアファイルを調べます。 – strkol

答えて

7

私はなど特定の変数、引数...のアドレスを調べ、その後、私は(./使用)GDBの外でそれを実行し、これらのアドレスは私はGDB

で見たものと同じになります

です。

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

Linux上のGDBはデフォルトでASLRを無効にして、デバッグを容易にします。 set disable-randomization offでGDBの下でASLRを再度有効にすることができます。これにより、GDBで問題を再現することができます。

私は、バッファオーバーフロー

を持っている。またValgrindAddress Sanitizerのようなツールは、多くの場合、GDBの下で実行されているよりも、バッファオーバーフローを見つけるための非常に効果的であることに、注意してください。アドレスサニタイザは、特にグローバルとバンプ上のバッファオーバーフローを検出する点でです(Valgrindはそうではありません)。

0

-gフラグを指定してコンパイルすると、実行可能な追加情報が壊れてコードサイズが大きくなります。

あなたのバッファの問題に関しては、状況が狂うコードスニペットを公開するのに役立ちます。

2

決まった場所に特定のコードやバールが配置されることは決してありません。

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

+2

私はちょうど[住所スペースレイアウトのランダム化(ASLR)](http://en.wikipedia.org/wiki/Address_space_layout_randomization)について言及しました。 – Blastfurnace

+0

位置依存の実行可能ファイルでは、すべてのグローバル変数がある実行から別の実行に同じ固定アドレスに留まることを*安全に仮定できます。 –

+1

@雇用ロシア:私はそれを期待しません。どうしてそう思うの? –

関連する問題