gccコンパイラを使用してLinuxプラットフォーム(Ubuntu 10.04)でコンパイルし、別々の実行可能ファイルを2つ取得しました。 2つのアセンブリファイル内の対応する命令のアドレスさえも同じであることが判明しました。プログラムは、変数のアドレスを出力していました。実行時に異なるアドレスが生成されましたさらに同じプログラムが毎回実行されるときに異なるアドレスを生成します。コードラインのアドレスは2つのプログラムで同じですが、実行されるたびに同じプログラムであっても変数のアドレスが変更されます。画面は仮想アドレスですが、その仮想なぜそれは毎回同じであることはできません。objdによって得られたアセンブリコードで示されたアドレスumpも仮想ですか?なぜ変数のアドレスが実行間で変化し続けているのですか
答えて
address space layout randomizationが原因です。ウィキペディアを引用する
:
アドレス空間配置のランダム化(ASLR)は、ランダムに、キーデータ領域の位置を配置する通常のライブラリの実行可能な位置の塩基を含む、ヒープを含むコンピュータセキュリティ方法であって、プロセスのアドレス空間にスタックします。
利点
アドレス空間のランダム化は、それがより困難、攻撃者がターゲットアドレスを予測できるようにすることで、セキュリティ攻撃のいくつかのタイプを妨げます。たとえば、return-to-libc攻撃を実行しようとする攻撃者は、実行するコードを特定しなければなりませんが、スタックに注入されたシェルコードを実行しようとする他の攻撃者はスタックを最初に見つけなければなりません。どちらの場合も、関連するメモリアドレスは攻撃者から隠されています。これらの値は推測する必要があり、誤った推測は通常、アプリケーションのクラッシュのため回復できません。例えば
、私は繰り返し私のUbuntu 10.10ボックスで、次のCコードから生成された同じ実行可能ファイルを実行します:ローカル変数(x
)のアドレスが変化し続け
#include <stdio.h>
int g = 0;
int main() {
int x = 0;
printf("%p %p\n", &x, &g);
}
が、アドレスグローバル変数(g
)の値は変わりません。
グローバル変数のアドレスが同じままである理由を説明できますか?キーデータエリアのアドレスをランダムに変更するとき。これはまた、このグローバル変数を含むプロセスの仮想メモリ内の "data"セクションのアドレス範囲を変更します。 – user3834119
はい、Address変数では常に値が変更されます。これは、実行モードでプログラムを実行するときに、変数宣言文を実行するときに、コントローラが使用可能なメモリ位置に基づいて変数を作成するたびに発生するためです。これが唯一の理由で、アドレスごとに異なる値を返すたびに発生します。
- 1. なぜ私の変数はメソッド間で持続しないのですか? - iPhone
- 2. 同じ変数が異なる実行で異なる仮想アドレスを持つのはなぜですか?
- 3. 背景色が変化しないのはなぜですか?
- 4. 複数の '&'を追加すると、変数のアドレスが変わるのはなぜですか?
- 5. Pythonスクリプトの実行間に永続変数を保持する
- 6. TestCompleteがステータスイメージ名を変更し続けるのはなぜですか?
- 7. 関数スコープの静的変数がオブジェクトインスタンス間で持続するのはなぜですか?
- 8. コンパイラが型変換を実行しないのはなぜですか?
- 9. javascript変数が関数間で変更されないのはなぜですか?次のJavaScript機能付き
- 10. この揮発性変数のアドレスが常に1になっているのはなぜですか?
- 11. カスタムパレットからClearAll ["Global` *"]を実行してローカル変数の色を更新しないのはなぜですか?
- 12. セッション変数が機能しないのはなぜですか?
- 13. SASマクロ変数がローカルスコープでないのはなぜですか?
- 14. 実行がメソッドdidMoveToViewにあるとき、自己変更のアドレスはなぜですか?
- 15. RDPで接続するとScreen.AllScreensが変化しない
- 16. なぜ変化の変種に大きな差があるのですか?
- 17. ASPラベル?なぜ=変数だけではないのですか?クラシックASPで
- 18. Apache XAMPPで実行しているときにコンテンツが変更されるのはなぜですか?
- 19. リクエスト間で変数を持続する
- 20. System.Timerでクラスメンバー変数が変更されないのはなぜですか?
- 21. 変数が数値で始まるのはなぜですか?
- 22. なぜ私の変数は自分自身をリセットし続けますか?
- 23. 環境変数のアドレスのランダム化
- 24. なぜAndroidのバージョンによって変数が変わるのですか?
- 25. なぜ変数が私のために働いていないのですか?
- 26. responseText変数が返されて、なぜPHPにアクセスしないのですか?
- 27. クローージャーブートのタスクの実行順序が変わるのはなぜですか?
- 28. NodeMCUで再起動しても変数を永続化する
- 29. 変数のアドレスをレジスタにコピーするのではなく、ASMで指定するのはなぜですか?
- 30. AngularJS関数が実行されていないのはなぜですか?
ほとんどの可視アドレスは、現代のCPU + OSでは仮想的です。さらに、アドレスは、ほとんどのプログラミング言語ではそのような要件がないため、同じである必要はありません。 –