私は単純なCプログラムを作成し、それをGDBにロードするたびにプログラム命令に割り当てられた同じメモリアドレスを見ます。たとえば、関数はwhat()
常にメモリ位置0x000055555555472dにロードされます。実際、スタックは毎回まったく同じです(スタックの内容だけでなく、rspが指すメモリアドレスも同じです)。
「/proc/sys/kernel/randomize_va_space」を0に設定してLinuxでASLRを無効にできることを知っていますが、私のDebianシステムでは値は2です。
root@Sierra ~ % cat /proc/sys/kernel/randomize_va_space
2
ASLRの私の理解によると、これらのアドレスは実行ごとにランダムに指定する必要があります。私の質問はなぜこれが起こるのですか?私は何が間違っていましたか?
答え1
デフォルトでは、gdbはLinuxでアドレス空間のランダム化を無効にして、kernel.randomize_va_space
sysctl変数が持つことができるすべての値をオーバーライドします。
gdbコマンドset disable-randomization off
この機能はオフになり、gdbによって生成されたすべての後続のデバッグターゲットでは、値に応じてASLRがオンまたはオフになりますkernel.randomize_va_space
。
答え2
プログラムはどのようにコンパイルされますか? Centos 7システム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
%