2016-12-08 2 views
5

私はOSの教科書を読んでいますが、システムが仮想アドレスをサポートしているかどうかを確認し、次のプログラムが毎回同じ結果を出力する必要があると言う例があります。私は私のMacBookプロのいくつかの違いを参照してください。アドレスのランダム化:cで静的なvarのプリントアドレス

#include <stdio.h> 

int var = 0; 
int main(void) 
{ 
    var += 1; 
    printf("Address: %x, value: %d\n", &var, var); 
    return 0; 
} 

実行したときに、それは私が(すべてではないそれらのが)いくつかのバイトのアドレスの変更を参照してください。

./main 
Address: e8c6018, value: 1 
./main 
Address: 9032018, value: 1 
./main 
Address: 1bc7018, value: 1 

私はGDBで実行すると、私は常に1018を参照してください。

(gdb) r 
Starting program: /Users/xilan/temp/main 
Address: 1018, value: 1 
[Inferior 1 (process 19631) exited normally] 
(gdb) r 
Starting program: /Users/xilan/temp/main 
Address: 1018, value: 1 
[Inferior 1 (process 19636) exited normally] 
(gdb) r 
Starting program: /Users/xilan/temp/main 
Address: 1018, value: 1 
[Inferior 1 (process 19654) exited normally] 

これをGDBで直接実行するとどう違うのですか?なぜそれを直接実行するとアドレスが変わるのが分かりますか?

+3

本が古くなって、それが(HTTPS [アドレス空間レイアウトのランダム化]について考えていませんでした私たちが定期的に出力を期待する場合オフをオンにする必要があり.wikipedia.org/wiki/Address_space_layout_randomization)。 – unwind

+0

ASLRについて言及しているので、私のシステムは静的変数の場所をランダム化します。 – user2018791

+0

ASLRが実装されているレベルでは、OSはマッピングを作成しているメモリの特定のページに何が入っているのか正確には気にしません。 「静的変数」は、基本的に「書き込み可能なメモリ内のもの」です。 – unwind

答えて

2

あなたの書籍は古いです。今日のオペレーティングシステムの多くは、プログラムやライブラリがロードされて特定の攻撃に対してより安全なものになるようにランダム化しています。

MacOSはプログラムがメモリにロードされるランダム化します。 gdbのランダム化を無効にしますが、これはgdbのアドレスが常に同じように見える理由です。 GDB

2

、我々は常に、同じアドレスを取得しても、異なるプロセスで実行されますが、これは、によるものであるため、Linuxの

./main 
Address: e8c6018, value: 1 
./main 
Address: 9032018, value: 1 
./main 
Address: 1bc7018, value: 1 

で直接実行する場合、通常の動作は、以下のようにする必要がありますGDBで、無効化ランダム化は、でであり、デフォルトではとなります。

set disable-randomization off 

参考リンク:// EN:http://visualgdb.com/gdbreference/commands/set_disable-randomization

関連する問題