flag checker

Descrição do Desafio

Categoria: rev

Descrição:

All you need to do is to guess the flag!

Arquivos

Arquivo
Descrição

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:

main.c
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!!!}

Autor da WriteUp

Membro de Exploitation - CaioMendesRRosa

Atualizado