2012-01-23 12 views
5

gccコンパイラを使用してLinuxプラットフォーム(Ubuntu 10.04)でコンパイルし、別々の実行可能ファイルを2つ取得しました。 2つのアセンブリファイル内の対応する命令のアドレスさえも同じであることが判明しました。プログラムは、変数のアドレスを出力していました。実行時に異なるアドレスが生成されましたさらに同じプログラムが毎回実行されるときに異なるアドレスを生成します。コードラインのアドレスは2つのプログラムで同じですが、実行されるたびに同じプログラムであっても変数のアドレスが変更されます。画面は仮想アドレスですが、その仮想なぜそれは毎回同じであることはできません。objdによって得られたアセンブリコードで示されたアドレスumpも仮想ですか?なぜ変数のアドレスが実行間で変化し続けているのですか

+0

ほとんどの可視アドレスは、現代のCPU + OSでは仮想的です。さらに、アドレスは、ほとんどのプログラミング言語ではそのような要件がないため、同じである必要はありません。 –

答えて

5

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)の値は変わりません。

+0

グローバル変数のアドレスが同じままである理由を説明できますか?キーデータエリアのアドレスをランダムに変更するとき。これはまた、このグローバル変数を含むプロセスの仮想メモリ内の "data"セクションのアドレス範囲を変更します。 – user3834119

1

はい、Address変数では常に値が変更されます。これは、実行モードでプログラムを実行するときに、変数宣言文を実行するときに、コントローラが使用可能なメモリ位置に基づいて変数を作成するたびに発生するためです。これが唯一の理由で、アドレスごとに異なる値を返すたびに発生します。

関連する問題