10

実行可能ファイルを逆アセンブルしています:

(gdb) disas main
Dump of assembler code for function main:
0x004012d0 <main+0>:    push   %ebp
0x004012d1 <main+1>:    mov    %esp,%ebp
...

メモリ アドレスが同じであるたびに: 0x004012d0.

メモリアドレスはOSによって動的に割り当てられるのではないですか?

アップデート

これは仮想空間であり、一部のプラットフォームではランダム化できることがわかりました。

誰かが変更するgdbダンプを投稿できますか?

4

8 に答える 8

3

ここでの問題 (少なくとも Linux では) は、ドキュメントから gdb が助けようとしている可能性があると思います:

ランダム化を無効にする

ランダム化の無効化をオンに設定

このオプション (gdb ではデフォルトで有効) は、開始されたプログラムの仮想アドレス空間のネイティブなランダム化をオフにします。このオプションは、複数のデバッグ セッションで実行の再現性を高め、デバッグ セッション間でメモリ アドレスを再利用できるようにするのに役立ちます。

この機能は、gnu/Linux でのみ実装されています。を使用して同じ動作を得ることができます

         (gdb) set exec-wrapper setarch `uname -m` -R

http://sourceware.org/gdb/current/onlinedocs/gdb/Starting.html

更新:これを確認したところ、私の場合はそうであるようです(Linux 2.6.28を実行しています)。単純な Hello World プログラムをコンパイルし、コマンドライン引数なしで gdb を起動します (disable-randomization 設定をオーバーライドする前にプログラムをロードしたくありません)、次のように入力します。

(gdb) set disable-randomization off
(gdb) file ./a.out
(gdb) break main
(gdb) run
(gdb) disas printf

printf のアドレスは、プログラムを実行するたびに異なります。

于 2010-03-31T20:59:51.470 に答える
3

OSに依存します。ほとんどの場合、バイナリのアドレスは変わりません。これは、バッファ オーバーフローなどのメモリ操作のバグを悪用するために重要です。Linux でリンクされたライブラリのアドレスは、ASLR のために常に異なります。Windows Vista および Windows 7 では、バイナリの仮想メモリ スペースも実行されるたびにランダム化されるため、関数のアドレスは実行ごとに異なります。

于 2010-03-31T19:38:33.773 に答える
2

はいといいえ。物理メモリは OS によって割り当てられ、OS だけがプログラムが物理 RAM のどこにあるかを認識します。プログラムは仮想アドレスのみを認識します。これは、すべてが同じ順序でロードされる場合、常に同じになります。

于 2010-03-31T19:37:08.757 に答える
2

実行可能な再配置

一部の実行可能ファイルは、常に同じアドレスにロードされるように設定されています。一部は「再配置可能」に設定されています。Visual Studio リンカーでこれを制御するオプションは、/FIXED と呼ばれます。そのような実行可能ファイルでさえ、ほとんどの場合、優先アドレスにロードされます。新しい OS (Win7、Vista) は、一部の実行可能ファイルの読み込みアドレスをランダム化してセキュリティを向上させます (未知のアドレスに読み込まれたプロセスへの攻撃はより困難になります) - これはASLRと呼ばれます。注: /FIXED:NO とマークされた実行可能ファイルでさえ、ASLR に適しているとは見なされません。開発者は、実行可能ファイルに対して明示的に ASLR を許可する必要があります。

仮想アドレス空間

注: プロセスがアドレス空間全体を所有していることを理解することが重要です。複数のプロセスにはそれぞれ独自のアドレス空間があるため、同じ実行可能ファイルを複数回起動しても、毎回同じアドレスにロードできない理由はありません。

于 2010-03-31T19:39:08.297 に答える
1

それが仮想アドレスです。物理アドレスは OS に認識されていますが、各プロセスには独自の仮想アドレス空間があります。再配置可能なイメージ、特にメインの実行可能ファイルは、毎回同じマッピングを取得する可能性があります。しかし、それは保証されません。例は DLL です。DLL は異なる順序でロードされる可能性があり、実行間で異なる仮想アドレスが生じる可能性があります。これは、DLL 1 がロードされると、DLL 2 がその仮想アドレスにロードできず、独自のアドレスを取得する必要があるためです。

于 2010-03-31T19:36:59.517 に答える
0

これらは、コンピュータ セキュリティの用語です。以前は固定アドレスでした (< 1996 年、LKMLによると、しかし、 ASLRを実装するために、executable が再配置可能としてコンパイルされ始めたのはごく最近のことです。そのライブラリは、必要に応じて別のアドレスに再ロードできます -動的再配置を読み取りますが、ロードの順序により、これらのメイン システムコール API は通常、固定アドレスにロードされます。) 今日でも、

gdb /bin/ls を実行して「実行」すると、デフォルトのアドレスが変更されていないことがわかります。

(gdb) disassemble __open 関数 open のアセンブラ コードのダンプ: 0xb7f017f0 <+0>: cmpl $0x0,%gs:0xc 0xb7f017f8 <+8>: jne 0xb7f0181c

とにかく、ASLR はPaXに由来します - ウィキを読んでください。ASLR を実装するための要件について多くをカバーしています。

ASLR を使用する理由 2 種類の攻撃を防止するには: http://en.wikipedia.org/wiki/Return-to-libc_attackhttp://en.wikipedia.org/wiki/Return-directional_programming 。修正された場合、どちらの攻撃もコード領域を想定しているためです。記憶に。

于 2011-10-13T15:22:03.667 に答える
0

オペレーティング システムによって異なります。仮想メモリを備えた最近のほとんどのオペレーティング システムでは、実行可能コードを再配置可能にする必要はありませんが、古いオペレーティング システムや一部の特殊なオペレーティング システム (リアルタイム、組み込みなど) では、コード オーバーレイを位置非依存型と組み合わせて使用​​できます。コードとジャンプ テーブル。この場合、関数のアドレスが変更される可能性があります。たとえば、コード セグメントがスワップ アウトされ、別のアドレスでスワップ インされる場合などです。

于 2010-03-31T19:42:31.070 に答える
-3

OS が別のアドレスを選択するのはなぜですか?

OS がプロセスを実行すると、実行可能ファイルが仮想メモリ空​​間に読み込まれます。その過程で、相対参照および/またはシンボリック参照が解決されます。同じ実行可能ファイルと同じ共有ライブラリがあり、前回と同じ方法で起動したと仮定すると、OS がの方法で実行可能ファイルをロードすることを決定するのは非常に奇妙です。

于 2010-03-31T19:36:02.217 に答える