1

x86システムでmmap()のASLRランダム化を研究しています。私は多くの場所で、mmap()でロードされたアドレスに16ビットのランダム化があることを読みました。

しかし、私が見つけたソースコードで:

static unsigned long mmap_rnd(void)
02  {
03          unsigned long rnd = 0;
04   
05         /*
06          *  8 bits of randomness in 32bit mmaps, 20 address space bits
07          * 28 bits of randomness in 64bit mmaps, 40 address space bits
08          */
09          if (current->flags & PF_RANDOMIZE) {
10                  if (mmap_is_ia32())
11                          rnd = (long)get_random_int() % (1<<8);
12                  else 
13                          rnd = (long)(get_random_int() % (1<<28));
14          }
15          return rnd << PAGE_SHIFT;
16  }

つまり、それはわずか8ビットのランダム性になります。

しかし実際には、いくつかのテストを実行すると、次のアドレス(stack-heap-mmap)bf937000,09a60000、b774b000を取得します

bfa86000,090ef000、b76e2000

それがb77XX000とb76XX000である可能性がある場合、その16ビット以上です!!!!

これについて何か助けはありますか?

4

1 に答える 1

1

PAGE_SHIFTそのランダム性を別のビット位置にシフトしています。mmapあなたの住所の違いは確かに:

 b774b000
-b76e2000
---------
    69000

の値はわかりませんがPAGE_SHIFT、たとえば12の場合、0x698ビットに完全に適合する違いがあります。

于 2012-12-11T20:37:13.570 に答える