Por que a localização das variáveis de ambiente varia muito?

9

Ao ler o livro Hacking: The Art of Exploitation, de Jon Erickson, estou tentando aproximar o endereço de uma variável de ambiente SHELLCODE para explorar um programa.

Sempre que executo getenv("SHELLCODE"); para obter a localização, o resultado é completamente diferente.

Extrair do meu shell:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

Eu entendo que se o nome do programa for modificado ou novas variáveis de ambiente forem adicionadas, a posição seria um pouco diferente, mas por que a localização varia tanto?

    
por Janman 13.09.2014 / 21:06

1 resposta

13

O que você descreve é um recurso anti-exploração chamado Randomização de Layout de Espaço de Endereço (ASLR). Basicamente, o kernel coloca o endereço muito superior da pilha de chamadas de função de um programa em um endereço um pouco diferente ("aleatório") toda vez que o kernel carrega o arquivo ELF do programa do disco. Os endereços em argv e as variáveis de ambiente, das quais seu shellcode é um, terminam em um endereço variável com cada chamada de programa.

O ASLR deve dificultar a exploração de buffer overflows e outras vulnerabilidades relacionadas à pilha. O explorador tem que escrever código ou fazer algo para explicar os endereços variáveis de variáveis e valores na pilha de chamadas de função.

Parece que você pode desativar o ASLR fazendo algo como:

echo 0 > /proc/sys/kernel/randomize_va_space

como o usuário root. Como você explícita cita o Ubuntu, o comando acima é diferente:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
    
por 14.09.2014 / 01:28