InitOne

Reconhecimento

apresentacao

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.

codigo-fonte

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.

get_flag

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:

offset

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.

sc

O exploit será salvo em um arquivo, então só precisamos ler e redirecionar a saida para o binário.

flag