探しているリストは、次のように簡単に生成できます。
int global_j = 0;
void main ()
{
char *h = malloc(10);
int j = 0;
printf ("Globals are : %p, text is %p, stack is %p, heap is %p\n",
&global_j, main, &j, h);
}
マウンテンライオンでは、これは次のようになります。
bash-3.2# ./a
Globals are : 0x10fa55020, text is 0x10fa54eb0, stack is 0x7fff501ab864, heap is 0x7f9b294000e0
bash-3.2# ./a
Globals are : 0x106bbe020, text is 0x106bbdeb0, stack is 0x7fff59042864, heap is 0x7f9752c000e0
bash-3.2# ./a
Globals are : 0x108673020, text is 0x108672eb0, stack is 0x7fff5758d864, heap is 0x7fecc34000e0
bash-3.2# ./a
Globals are : 0x1059d2020, text is 0x1059d1eb0, stack is 0x7fff5a22e864, heap is 0x7f8f81c000e0
すべてに十分なランダム化を示しています(配置の制限により、ページ内のオフセットはランダム化されませんが、4〜5桁の16進数が変化することからわかるように、16〜20ビットのランダム化が得られます)。
- カーネル:Mountain LionおよびiOS6の時点で、カーネルは、ロード時にvm_kernel_slideの値で「スライド」することによってランダム化されます。すべてのVMページがこのようにスライドするわけではありませんが、ほとんどの場合、これは一定の値を格納することで機能します(これは、MLではシステムコール#439、kas_infoでも読み取り可能ですが、iOSでは読み取り可能ではありません:Appleはランダム化を維持するのに苦労しています秘密を大切にし、カーネルアドレスを報告するときにそれを漏らさないので、ジェイルブレーカーはどこにジャンプ/上書きできるかを理解しません-これはほとんどの場合機能します)
お役に立てれば、
TG