Stack Shellcode
Informações Básicas
Shellcode de pilha é uma técnica usada na exploração binária onde um atacante escreve shellcode em uma pilha de um programa vulnerável e então modifica o Ponteiro de Instrução (IP) ou Ponteiro de Instrução Estendido (EIP) para apontar para a localização desse shellcode, fazendo com que ele seja executado. Este é um método clássico usado para obter acesso não autorizado ou executar comandos arbitrários em um sistema alvo. Aqui está uma explicação do processo, incluindo um exemplo simples em C e como você poderia escrever um exploit correspondente usando Python com pwntools.
Exemplo em C: Um Programa Vulnerável
Vamos começar com um exemplo simples de um programa vulnerável em C:
Este programa é vulnerável a um estouro de buffer devido ao uso da função gets()
.
Compilação
Para compilar este programa desabilitando várias proteções (para simular um ambiente vulnerável), você pode usar o seguinte comando:
-fno-stack-protector
: Desativa a proteção de pilha.-z execstack
: Torna a pilha executável, o que é necessário para executar shellcode armazenado na pilha.-no-pie
: Desativa o Executável Independente de Posição, facilitando a previsão do endereço de memória onde nosso shellcode estará localizado.-m32
: Compila o programa como um executável de 32 bits, frequentemente usado para simplificar o desenvolvimento de exploits.
Exploração em Python usando Pwntools
Veja como você poderia escrever um exploit em Python usando pwntools para realizar um ataque ret2shellcode:
Este script constrói um payload consistindo de um NOP slide, o shellcode, e então sobrescreve o EIP com o endereço apontando para o NOP slide, garantindo que o shellcode seja executado.
O NOP slide (asm('nop')
) é usado para aumentar a chance de que a execução "deslize" para o nosso shellcode, independentemente do endereço exato. Ajuste o argumento p32()
para o endereço inicial do seu buffer mais um deslocamento para aterrissar no NOP slide.
Proteções
ASLR deve ser desativado para que o endereço seja confiável em várias execuções, ou o endereço onde a função será armazenada não será sempre o mesmo e você precisaria de algum vazamento para descobrir onde a função win está carregada.
Canários de Pilha também devem ser desativados, ou o endereço de retorno comprometido do EIP não será seguido.
NX a proteção da stack impediria a execução do shellcode dentro da stack, porque essa região não seria executável.
Outros Exemplos e Referências
64 bits, ASLR com vazamento de endereço da stack, escrever shellcode e saltar para ele
32 bits, ASLR com vazamento de endereço da stack, escrever shellcode e saltar para ele
32 bits, ASLR com vazamento de endereço da stack, comparação para evitar chamada para exit(), sobrescrever variável com um valor e escrever shellcode e saltar para ele
arm64, sem ASLR, gadget ROP para tornar a stack executável e saltar para o shellcode na stack
Last updated