Randomização de memória no Linux

3

Eu criei um programa C simples e toda vez que eu carrego no GDB, vejo os mesmos endereços de memória alocados para as instruções do programa. Por exemplo, uma função what() sempre carrega no local da memória 0x000055555555472d. Na verdade, a pilha é exatamente a mesma para cada execução (não apenas o conteúdo da pilha, mas o endereço de memória para o qual o rsp aponta.

Eu entendo que o ASLR pode ser desabilitado no Linux, definindo "/ proc / sys / kernel / randomize_va_space" como 0, mas meu sistema Debian possui valor 2 nele.

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

De acordo com minha compreensão do ASLR, esses endereços devem ser randomizados a cada execução. Minha pergunta é por que isso está acontecendo? Eu recebi algo errado?

    
por 7_R3X 05.08.2017 / 10:32

2 respostas

5

O Gdb desabilita a randomização do espaço de endereço no Linux por padrão. O comando gdb set disable-randomization off desativará esse recurso e quaisquer destinos de depuração criado pelo gdb posteriormente terá o ASLR ativado ou desativado, dependendo do valor da variável kernel.randomize_va_space sysctl.

    
por 05.08.2017 / 15:21
0

Como o programa foi compilado? Em um sistema Centos 7 dado blah.c e com o desenvolvimento foo instalado

#include <stdio.h>

int whereisthis(void) { return 42; }

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

o endereço de whereisthis pode depender dos flags de compilação

% 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
% 
    
por 05.08.2017 / 16:17