Ret2win
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)
Os desafios Ret2win são uma categoria popular em competições de Capture The Flag (CTF), particularmente em tarefas que envolvem binary exploitation. O objetivo é explorar uma vulnerabilidade em um binário dado para executar uma função específica, não invocada, dentro do binário, frequentemente nomeada como win
, flag
, etc. Essa função, quando executada, geralmente imprime uma flag ou uma mensagem de sucesso. O desafio normalmente envolve sobrescrever o endereço de retorno na pilha para desviar o fluxo de execução para a função desejada. Aqui está uma explicação mais detalhada com exemplos:
Considere um programa simples em C com uma vulnerabilidade e uma função win
que pretendemos chamar:
Para compilar este programa sem proteções de pilha e com ASLR desativado, você pode usar o seguinte comando:
-m32
: Compile o programa como um binário de 32 bits (isso é opcional, mas comum em desafios CTF).
-fno-stack-protector
: Desativar proteções contra estouros de pilha.
-z execstack
: Permitir a execução de código na pilha.
-no-pie
: Desativar Executável Independente de Posição para garantir que o endereço da função win
não mude.
-o vulnerable
: Nomear o arquivo de saída como vulnerable
.
Para o exploit, usaremos pwntools, um poderoso framework CTF para escrever exploits. O script do exploit criará um payload para transbordar o buffer e sobrescrever o endereço de retorno com o endereço da função win
.
Para encontrar o endereço da função win
, você pode usar gdb, objdump ou qualquer outra ferramenta que permita inspecionar arquivos binários. Por exemplo, com objdump
, você poderia usar:
Este comando mostrará a você a montagem da função win
, incluindo seu endereço inicial.
O script Python envia uma mensagem cuidadosamente elaborada que, quando processada pela vulnerable_function
, transborda o buffer e sobrescreve o endereço de retorno na pilha com o endereço de win
. Quando vulnerable_function
retorna, em vez de retornar para main
ou sair, ele salta para win
, e a mensagem é impressa.
PIE 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 leak para descobrir onde a função win está carregada. Em alguns casos, quando a função que causa o transbordamento é read
ou similar, você pode fazer uma Sobrescrita Parcial de 1 ou 2 bytes para mudar o endereço de retorno para ser a função win. Devido ao funcionamento do ASLR, os últimos três nibbles hexadecimais não são randomizados, então há uma chance de 1/16 (1 nibble) de obter o endereço de retorno correto.
Stack Canaries também devem ser desativados ou o endereço de retorno EIP comprometido nunca será seguido.
32 bits, sem ASLR
64 bits com ASLR, com um leak do endereço bin
64 bits, sem ASLR
32 bits, sem ASLR, transbordamento pequeno duplo, primeiro para transbordar a pilha e aumentar o tamanho do segundo transbordamento
32 bits, relro, sem canário, nx, sem pie, string de formato para sobrescrever o endereço fflush
com a função win (ret2win)
32 bits, nx, nada mais, sobrescrita parcial de EIP (1Byte) para chamar a função win
32 bits, nx, nada mais, sobrescrita parcial de EIP (1Byte) para chamar a função win
O programa está apenas validando o último byte de um número para verificar o tamanho da entrada, portanto, é possível adicionar qualquer tamanho desde que o último byte esteja dentro da faixa permitida. Então, a entrada cria um transbordamento de buffer explorado com um ret2win.
64 bits, relro, sem canário, nx, pie. Sobrescrita parcial para chamar a função win (ret2win)
arm64, PIE, dá um leak PIE, a função win é na verdade 2 funções, então gadget ROP que chama 2 funções
ARM64, off-by-one para chamar uma função win
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)