Stack Overflow
O que é um Estouro de Pilha
Um estouro de pilha é uma vulnerabilidade que ocorre quando um programa escreve mais dados na pilha do que é alocado para armazenar. Esses dados em excesso irão sobrescrever o espaço de memória adjacente, levando à corrupção de dados válidos, interrupção do fluxo de controle e potencialmente à execução de código malicioso. Esse problema frequentemente surge devido ao uso de funções inseguras que não realizam verificação de limites na entrada.
O principal problema dessa sobrescrita é que o ponteiro de instrução salvo (EIP/RIP) e o ponteiro de base salvo (EBP/RBP) para retornar à função anterior são armazenados na pilha. Portanto, um atacante poderá sobrescrevê-los e controlar o fluxo de execução do programa.
A vulnerabilidade geralmente surge porque uma função copia mais bytes para dentro da pilha do que a quantidade alocada para ela, podendo assim sobrescrever outras partes da pilha.
Algumas funções comuns vulneráveis a isso são: strcpy
, strcat
, sprintf
, gets
... Além disso, funções como fgets
, read
& memcpy
que recebem um argumento de comprimento, podem ser usadas de forma vulnerável se o comprimento especificado for maior do que o alocado.
Por exemplo, as seguintes funções poderiam ser vulneráveis:
Encontrando os deslocamentos de Estouro de Pilha
A maneira mais comum de encontrar estouros de pilha é fornecer uma entrada muito grande de A
s (por exemplo, python3 -c 'print("A"*1000)'
) e esperar um Segmentation Fault
indicando que o endereço 0x41414141
foi tentado ser acessado.
Além disso, uma vez que você descobrir que há uma vulnerabilidade de Estouro de Pilha, será necessário encontrar o deslocamento até ser possível sobrescrever o endereço de retorno, para isso geralmente é usado uma sequência de De Bruijn. Que para um dado alfabeto de tamanho k e subsequências de comprimento n é uma sequência cíclica na qual cada subsequência possível de comprimento n aparece exatamente uma vez como uma subsequência contígua.
Dessa forma, em vez de precisar descobrir manualmente qual deslocamento é necessário para controlar o EIP, é possível usar uma dessas sequências como preenchimento e depois encontrar o deslocamento dos bytes que acabaram sobrescrevendo-o.
É possível usar o pwntools para isso:
ou GEF:
Explorando Estouros de Pilha
Durante um estouro (supondo que o tamanho do estouro seja grande o suficiente), você será capaz de sobrescrever valores de variáveis locais dentro da pilha até atingir o EBP/RBP e EIP/RIP salvos (ou até mais). A maneira mais comum de abusar desse tipo de vulnerabilidade é modificando o endereço de retorno para que, quando a função terminar, o fluxo de controle seja redirecionado para onde o usuário especificou nesse ponteiro.
No entanto, em outros cenários, talvez apenas sobrescrever alguns valores de variáveis na pilha seja suficiente para a exploração (como em desafios CTF fáceis).
Ret2win
Nesse tipo de desafios CTF, há uma função dentro do binário que nunca é chamada e que você precisa chamar para vencer. Para esses desafios, você só precisa encontrar o deslocamento para sobrescrever o endereço de retorno e encontrar o endereço da função a ser chamada (geralmente ASLR estaria desativado) para que, quando a função vulnerável retornar, a função oculta será chamada:
pageRet2winShellcode na Pilha
Nesse cenário, o atacante poderia colocar um shellcode na pilha e abusar do EIP/RIP controlado para pular para o shellcode e executar código arbitrário:
pageStack ShellcodeTécnicas ROP & Ret2...
Essa técnica é o framework fundamental para contornar a principal proteção da técnica anterior: Pilha não executável (NX). E permite realizar várias outras técnicas (ret2lib, ret2syscall...) que acabarão executando comandos arbitrários abusando de instruções existentes no binário:
pageROP - Return Oriented ProgramingEstouros de Heap
Um estouro nem sempre ocorrerá na pilha, também pode ocorrer no heap, por exemplo:
pageHeap OverflowTipos de proteções
Existem várias proteções que tentam evitar a exploração de vulnerabilidades, verifique-as em:
pageCommon Binary Exploitation Protections & BypassesLast updated