2013-06-07 15 views
5

32ビットシステムでは、各プロセスに実質的に2^32バイトのCONTIGUOUSアドレス空間があります。なぜリンカによって生成された最終的な実行可能コードが再配置可能である必要があるのですか?生成されるすべてのアドレスは、プロセス自身のアドレス空間内の仮想アドレスであり、他のプロセスは同じものを使用できないため、要件は何ですか? したがって、プロセスはどこにでも置くことができます。なぜ移転可能なの?仮想メモリとリロケータブルコード

+0

これをチェックしてください:http://stackoverflow.com/questions/7193888/load-time-relocation-and-virtual-memory – mohit

答えて

-1

プロセスを実行するためには、実行可能キュー内の実際のメインメモリに配置する必要があるため、再配置が必要です。ここで、メインメモリ内に置かれる場所は固定されていません(十分なスペースがある場合はどこにでも置かれます)ので、命令の実際のアドレスは仮想アドレスとは異なります。

そのための関数を呼び出すこと文、返品などは、一部のオペレーティング・システムがに(これは間違いなくすべてのオペレーティング・システムに普遍的ではありません)実行可能コードの再配置可能を作るこれらの関数の実際のアドレスに

+1

しかし、それはMMU(メモリ管理ユニット)によって注意が払われます。移転はそれと何が関係しているのですか? – user1863877

2

を指し応じて更新する必要がありますaddress space layout randomizationを許可してください。これにより、特定の攻撃を緩和できます。

過去にスタックが実行可能になった時点で、オーバーフローしたスタックまたはヒープに直接実行可能コードを書き込むことで、バッファオーバーフローを悪用する可能性がありました。オペレーティングシステムがよりスマートになり、スタックとヒープの実行を防止し始めたので、攻撃はより洗練され、return oriented programmingを実行することでメモリ内の既知のコードシーケンスを使用し始めました。そのクラスの攻撃への軽減は、共有ライブラリのメモリレイアウトをランダム化することで(悪用しやすくなったため)、実行可能ファイルのメモリ位置をランダム化することで攻撃者がメインの実行ファイルを攻撃するように切り替えた。メイン実行可能ファイルを再配置可能にする必要があります。

1

実行可能コードには必ずしも相対アドレスが含まれているとは限りません。たとえば、Windowsでは、アドレス指定は絶対的な場合が多い(たとえば、グローバルデータの場合)。

2つの異なる動的ライブラリを検討してください。両方とも固定ベースアドレス0x00100000のためにコンパイルされました。あなたのプログラムはそれらの両方を読み込もうとします。 2番目のDLLを配置するローダはどこにありますか?その好ましいベースアドレスは既に他のDLLによって使用されています。

この場合、再配置可能コードは、2番目のDLLを別のアドレスに配置し、内部ポインターを新しい場所にパッチするのに役立ちます。固定ベースアドレスでは、2番目のDLLのロードは失敗します。

関連する問題