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:
└─$ ./flag_checker
Enter the flag: flag{abc}
Incorrect!Como o título do desafio sugere, o programa apensa verifica se o input do usuário corresponde à flag. Abrindo o programa no ghidra:
undefined8 FUN_00101318(void)
{
int iVar1;
size_t sVar2;
long in_FS_OFFSET;
char local_38 [40];
long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28);
printf("Enter the flag: ");
fgets(local_38,0x23,stdin);
sVar2 = strcspn(local_38,"\n");
local_38[sVar2] = '\0';
iVar1 = FUN_0010127a(local_38);
if (iVar1 == 0) {
puts("Incorrect!");
}
else {
puts("Correct!");
}
if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return 0;
}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