アドレス空間レイアウトのランダム化(ALSR)により、別のプロセスから分岐されたプロセスは、mmap
を呼び出すときに返されるアドレスが異なります。しかし、わかったように、そうではありませんでした。私はその目的のために次のテストプログラムを作った。 malloc
によって返されたすべてのアドレスは、親と子の場合とまったく同じです。彼らは大きなブロックであるためmalloc
PL2、CL1、CL2、PL1のために内部mmap
を使用しています 注意。アドレス空間レイアウトランダム化(ALSR)とmmap
私の質問は、なぜmmap
がALSRの存在下でも異なるアドレスを返さない理由です。多分、ここでのランダム化のための種は元々のプロセスと同じです。それとも他の理由がありますか?すべてのポインタがタッチアップしなければならず、それは(ランタイム環境でもポインタである、あなたのデータのどの部分を知っていない)技術的に不可能だ -
int main()
{
pid = fork();
if (pid == 0) // child
{
void * c1 = malloc(4096);
void * c2 = malloc(4096);
void * cl1 = malloc((long)512e3); // internally uses mmap
void * cl2 = malloc((long)512e3); // internally uses mmap
printf("c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2);
}
else
{
void * p1 = malloc(4096);
void * p2 = malloc(4096);
void * pl1 = malloc((long)512e3); // internally uses mmap
void * pl2 = malloc((long)512e3); // internally uses mmap
printf("p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2);
}
return 0;
}
私はASLRが 'mmap'が別のアドレスを返すことを要求しているとは確信していません。それは単にそれが異なるものを返すかもしれないことを意味します。そしておそらく(ちょうど推測ですが) 'execve'によって' fork'よりもトリガされます。確かに、あなたのプログラムを2回連続して起動すると、私は別のアドレスを取得しています。これは将来のカーネルやSELinux対応のもので変更されるかもしれません... –
これは便利かもしれません:http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/ – Necrolis
@ Basile:もちろん、実行ごとに異なるアドレスが得られますが、1回の実行で2つのプロセス(親と子)のアドレスが異なるのですか? – MetallicPriest