単純な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の私の理解によれば、これらのアドレスは実行ごとにランダム化する必要があります。私の質問は、なぜこれが起こっているのかということです。私は何か間違ったことをしましたか?
デフォルトでは、gdbはLinuxでアドレス空間のランダム化を無効にし、kernel.randomize_va_space
sysctl変数が持つ可能性のある値をオーバーライドします。
Gdbコマンド set disable-randomization off
はこの機能をオフにし、その後gdbによって作成されたデバッグターゲットは、kernel.randomize_va_space
の値に応じてASLRをオンまたはオフにします。
プログラムはどのようにコンパイルされましたか? 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
%