flag checker
Descrição do Desafio
Categoria: rev
Descrição:
All you need to do is to guess the flag!
Arquivos
flag_checker
Executável do desafio.
solve.py
Script em Python que resolve o desafio.
📥 Download: Arquivos
Solução
O desafio disponibliza um arquivo binário. Executando o arquivo:
Como o título do desafio sugere, o programa apensa verifica se o input do usuário corresponde à flag. Abrindo o programa no ghidra:
Podemos observar que essa função recebe o input do usuário na variável local_38
, chama a função FUN_0010127a
e verifica o retorno da função para saber se a flag está correta ou incorreta.
Nesse tipo de desafio, podemos utilizar um script que usa a biblioteca angr para resolver de maneira bem simples esse tipo de programa. Para utilizar esse script, precisamos descobrir o tamanho da flag, algum endereço que é acessado apenas quando o input corresponde à flag e algum endereço que é acessado apenas quando o endereço não corresponde à flag.
Olhando a chamada da função fgets
, percebemos que a função pega 35 (0x23) caracteres do usuário, então a flag possui 35 caracteres. Como o puts("Correct!");
é acessado apenas quando o input é igual a flag e puts("Incorrect!");
quando o input é diferente da flag, podemos pegar o endereço dessas instruções.
Observando o assembly dessa parte do código, conseguimos ver que o endereço 0x00101391
é um endereço acessado quando o input do usuário é igual à flag e o endereço 0x0010139b
é acessado quando o input é incorreta. Portanto, podemos fazer o nosso script. (Obs: como a biblioteca angr utiliza o endereço base 0x400000, precisamo mudar os endereços obtidos levando em consideração essa base)
Agora, basta apenas rodar esse script. Rodando ele, obtemos:
Flag: ENO{R3V3R53_3NG1N33R1NG_M45T3R!!!}
ENO{R3V3R53_3NG1N33R1NG_M45T3R!!!}
Autor da WriteUp
Atualizado