Stack Shellcode
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Stack shellcode é uma técnica usada em binary exploitation onde um atacante escreve shellcode na pilha de um programa vulnerável e então modifica o Instruction Pointer (IP) ou Extended Instruction Pointer (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.
Vamos começar com um exemplo simples de um programa C vulnerável:
Este programa é vulnerável a um estouro de buffer devido ao uso da função gets()
.
Para compilar este programa desativando várias proteções (para simular um ambiente vulnerável), você pode usar o seguinte comando:
-fno-stack-protector
: Desabilita a proteção da pilha.
-z execstack
: Torna a pilha executável, o que é necessário para executar shellcode armazenado na pilha.
-no-pie
: Desabilita 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 por simplicidade no desenvolvimento de exploits.
Aqui está 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 offset para cair no NOP slide.
ASLR deve ser desativado para que o endereço seja confiável entre execuções ou o endereço onde a função será armazenada não será sempre o mesmo e você precisaria de algum leak para descobrir onde a função win está carregada.
Stack Canaries também devem ser desativados ou o endereço de retorno EIP comprometido nunca será seguido.
A proteção de stack NX impediria a execução do shellcode dentro da pilha porque essa região não seria executável.
64bit, ASLR com leak de endereço da pilha, escreva shellcode e salte para ele
32 bit, ASLR com leak da pilha, escreva shellcode e salte para ele
32 bit, ASLR com leak da pilha, comparação para evitar chamada para exit(), sobrescreva variável com um valor e escreva shellcode e salte para ele
arm64, sem ASLR, gadget ROP para tornar a pilha executável e saltar para o shellcode na pilha
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)