私はLinuxでメモリ領域の仮想メモリマッピング作業をしています。実行ファイルは単純な計算プログラムです。プログラムの2つのインスタンスが実行されると、以下に示すマッピングが表示されます/proc/pid/maps
。ヒープ、スタック、vvars、vdsoなどの場所は、ロード時にランダムにオフセットされているように見えます。なぜこのようなことをするのですか?
例1:ヒープは次から始まります。013f4000
00400000-00401000 r--p 00000000 08:16 3557412 <program-exe>
00401000-00480000 r-xp 00001000 08:16 3557412 <program-exe>
00480000-004a5000 r--p 00080000 08:16 3557412 <program-exe>
004a6000-004ac000 rw-p 000a5000 08:16 3557412 <program-exe>
004ac000-004ad000 rw-p 00000000 00:00 0
013f4000-01417000 rw-p 00000000 00:00 0 [heap]
7ffd98bd8000-7ffd98bf9000 rw-p 00000000 00:00 0 [stack]
7ffd98bfc000-7ffd98bff000 r--p 00000000 00:00 0 [vvar]
7ffd98bff000-7ffd98c00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
例2:ヒープは次から始まります。013cc000
00400000-00401000 r--p 00000000 08:16 3557412 <program-exe>
00401000-00480000 r-xp 00001000 08:16 3557412 <program-exe>
00480000-004a5000 r--p 00080000 08:16 3557412 <program-exe>
004a6000-004ac000 rw-p 000a5000 08:16 3557412 <program-exe>
004ac000-004ad000 rw-p 00000000 00:00 0
013cc000-013ef000 rw-p 00000000 00:00 0 [heap]
7ffe3717d000-7ffe3719e000 rw-p 00000000 00:00 0 [stack]
7ffe371fa000-7ffe371fd000 r--p 00000000 00:00 0 [vvar]
7ffe371fd000-7ffe371fe000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
答え1
これは、ASLR(Address Space Layout Randomization)というセキュリティ機能の結果です。 ASLRが有効になると、カーネルは重要なプロセスセグメントを任意のアドレスにロードします。すべての最新のLinuxカーネルはデフォルトでASLRを有効にします。 ASLRはを介して制御できます/proc/sys/kernel/randomize_va_space
。 ~から手順マニュアルページ:
/proc/sys/kernel/randomize_va_space(Linux 2.6.12以降)システムのASLR(Address Space Layout Randomization)ポリシーを選択します(ASLRをサポートするアーキテクチャで)。このファイルは3つの値をサポートします。
0 Turn ASLR off. This is the default for architectures that don't support ASLR, and when the kernel is booted with the norandmaps parameter. 1 Make the addresses of mmap(2) allocations, the stack, and the VDSO page randomized. Among other things, this means that shared libraries will be loaded at randomized addresses. The text segment of PIE-linked binaries will also be loaded at a randomized address. This value is the default if the kernel was configured with CONFIG_COM‐ PAT_BRK. 2 (Since Linux 2.6.25) Also support heap randomization. This value is the default if the kernel was not configured with CONFIG_COMPAT_BRK.
したがって、ASLR を一時的にディセーブルにするには、root として次のコマンドを実行します。
echo 0 > /proc/sys/kernel/randomize_va_space
テストを再実行すると、両方のプロセスが同じアドレスマッピングを持つことを確認できます。