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. 配列変数がそのアドレスと等しいのはなぜですか?
- 6. テキストがアクティビティで変化しないのはなぜですか?
- 7. なぜ私のscanf for char変数がコードブロックで実行中に値を受け入れないのですか?
- 8. イベントの値が変化し続ける
- 9. Cプログラムで変数のアドレス空間が変更される
- 10. VBA:乱数シートがループ内で変化し続ける
- 11. 逆離散フーリエ変換を実行するときに、インデックスを連続変数として扱うことができないのはなぜですか?
- 12. 背景色が変化しないのはなぜですか?
- 13. timstampはrecyclerviewで変化し続ける
- 14. 複数の '&'を追加すると、変数のアドレスが変わるのはなぜですか?
- 15. T-SQL関数のテーブル変数に対してINSERT EXECを実行できないのはなぜですか?
- 16. TestCompleteがステータスイメージ名を変更し続けるのはなぜですか?
- 17. 2つのconsole.log()行の間でJavascript変数の値が変化する
- 18. Pythonスクリプトの実行間に永続変数を保持する
- 19. 関数スコープの静的変数がオブジェクトインスタンス間で持続するのはなぜですか?
- 20. コンパイラが型変換を実行しないのはなぜですか?
- 21. 出力変数の値がループ内で変化しないのはなぜですか?Windowsバッチ
- 22. この揮発性変数のアドレスが常に1になっているのはなぜですか?
- 23. なぜ私はレジスタ変数のアドレスを取ることができますか?
- 24. javascript変数が関数間で変更されないのはなぜですか?次のJavaScript機能付き
- 25. カスタムパレットからClearAll ["Global` *"]を実行してローカル変数の色を更新しないのはなぜですか?
- 26. PHP変数がループサイクル内で永続的になるのはなぜですか?
- 27. typeof nullの値がループ内で変化するのはなぜですか?クロームコンソールでこのスニペットを実行
- 28. なぜ自動化スクリプトを実行している間にクロムにタスクキルを待っているのですか?
- 29. プログラムが夜間に実行されると、私の日は変わらないのはなぜですか?
- 30. セッション変数が機能しないのはなぜですか?
ほとんどの可視アドレスは、現代のCPU + OSでは仮想的です。さらに、アドレスは、ほとんどのプログラミング言語ではそのような要件がないため、同じである必要はありません。 –