Writeup OverFlow1
Felipe Brasileiro
Esse é o writeup do desafio OverFlow1 do PicoCTF-2019. Ele exige que o jogador saiba sobrescrever e manipular o endereço de retorno de uma função para pegar a flag.
Reconhecimento
Assim como nos outros desafios, o PicoCTF nos deu o código-fonte e o executável, mas, dessa vez a exploração já é mais complicada, pois temos que sobreescrever o endereço de retorno do programa para pegar a flag.
No código-fonte, podemos ver que o programa pega o nosso input através da função gets
, ou seja, o programa não limita a quantidade de caracteres que vai receber.
Outro ponto interessante desse código é que o endereço de retorno está sendo printado logo após o gets
, então podemos nos basear nisso para explorar esse programa.
Exploração
Já sabemos que devemos sobreescrever o endereço de retorno, mas com o que devemos sobrescrevê-lo?
Voltando ao código-fonte, podemos ver que tem uma função que nunca é chamada e que pode printar a flag, então vamos usar o endereço dela.
Utilizando o gdb-gef
, conseguimos “desassemblar” a função e pegar seu endereço de entrada.
Agora que temos o endereço da função (0x080485e6), só nos resta achar a posição do endereço de retorno.
Utilizando um padrão com 100 caracteres no input do programa, temos o seguinte resultado:
Conseguimos sobrescrever o endereço de retorno e o redirecionamos para 0x61616174 (bytes equivalentes aos caracteres taaa), ou seja, precisamos de 76 bytes para chegar ao endereço de retorno.
Com essas informações conseguimos montar o exploit.
O exploit será salvo em um arquivo, então só precisamos ler e redirecionar a saida para o binário.