web-dev-qa-db-ja.com

Linuxでのメモリのランダム化

単純なCプログラムを作成し、それをGDBにロードするたびに、プログラムの命令に割り当てられた同じメモリアドレスが表示されます。たとえば、関数what()は常にメモリ位置0x000055555555472dにロードされます。実際、スタックは実行ごとにまったく同じです(スタックの内容だけでなく、rspが指すメモリアドレスも同じです。

Linuxで「/ proc/sys/kernel/randomize_va_space」を0に設定することでASLRを無効にできることを理解していますが、私のDebianシステムには値2があります。

root@Sierra ~ % cat /proc/sys/kernel/randomize_va_space 
2

ASLRの私の理解によれば、これらのアドレスは実行ごとにランダム化する必要があります。私の質問は、なぜこれが起こっているのかということです。私は何か間違ったことをしましたか?

4
7_R3X

デフォルトでは、gdbはLinuxでアドレス空間のランダム化を無効にし、kernel.randomize_va_spacesysctl変数が持つ可能性のある値をオーバーライドします。

Gdbコマンド set disable-randomization off はこの機能をオフにし、その後gdbによって作成されたデバッグターゲットは、kernel.randomize_va_spaceの値に応じてASLRをオンまたはオフにします。

6
Mark Plotnick

プログラムはどのようにコンパイルされましたか? Centos7システムではblah.cそして開発fooがインストールされている

#include <stdio.h>

int whereisthis(void) { return 42; }

int main(void) {
    printf("%p\n", whereisthis);
    return 0;
}

whereisthisのアドレスは、コンパイルフラグに依存する可能性があります

% rm blah
% CFLAGS='-pipe' make blah
cc -pipe    blah.c   -o blah
% repeat 3 ./blah
0x40054c
0x40054c
0x40054c
% rm blah
% CFLAGS='-fstack-protector-all -fPIE -pie -pipe' make blah
cc -fstack-protector-all -fPIE -pie -pipe    blah.c   -o blah
% repeat 3 ./blah
0x7f0e9d3ba82f
0x7fd940aca82f
0x7f6961b1182f
% 
1
thrig