Linux의 메모리 무작위화

Linux의 메모리 무작위화

나는 간단한 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_spacesysctl 변수가 가질 수 있는 모든 값을 재정의합니다.

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
% 

관련 정보