CTF series piloto -- IO netgarage

h3ll0, fr13nd. Esse post dá início a série voltada para guias de CTFs e wargames que foram resolvidos por membros do GRIS.

Mas o que é um CTF ou wargame?

Os capture the flags (CTFs) e wargames são ótimas formas de testar conhecimento na área da segurança. Nesses desafios temos aplicações projetadas com vulnerabilidades disponíveis para que a comunidade coloque em prática aquilo que foi estudado.

O intuito das postagens sobre esses desafios não é fornecer respostas, mas guiar o leitor através da linha de raciocínio utilizada para resolvê-los . Estamos fazendo isso pois é difícil encontrar esse tipo de material em português e, além disso, é uma forma de fornecer a comunidade um pouco daquilo que aprendemos no GRIS.

O primeiro desafio:

Como primeiro desafio teremos o level01 do IO netgarage. A temática dele é engenharia reversa (RE) em uma máquina IA-32.

O primeiro passo é se conectar ao servidor fornecido pelo wargame. para isso, utilizamos o protocolo SSH.

$ ssh level1@io.netgarage.org
password: level1

conforme a descrição do wargame, temos acesso somente ao programa correspondente ao usuário utilizado. E, além disso, os programas se encontram no diretório /levels. Portanto, acessamos esse diretório $ cd /levels

feito isso, executamos o level01 $./level01 e com isso, recebemos a output:

Enter the 3 digit passcode to enter:

Então, precisamos descobrir a input necessária para que seja possível ler a senha do o level2 do wargame. Para descobrir a chave, utilizaremos o GDB (GNU debugger) da seguinte maneira $ gdb -q level01 O parâmetro -q é utilizado para o gdb não exibir sua “propaganda” habitual.

Feito isso, disassemblamos a função main do binário: (gdb) disassemble main e teremos como saída:

Dump of assembler code for function main:
   0x08048080 <+0>:	push   $0x8049128 //endereço colocado na pilha
   0x08048085 <+5>:	call   0x804810f //chamada de função
   0x0804808a <+10>:	call   0x804809f //chamada de função
   0x0804808f <+15>:	cmp    $0x10f,%eax //um valor é comparado com o retorno
   0x08048094 <+20>:	je     0x80480dc //se igual, pula para 0x80480dc
   0x0804809a <+26>:	call   0x8048103 //se não, chama 0x8048103
End of assembler dump.

O código acima está comentado, o que facilita enxergar a solução do problema. Aposto que o número em hexa que está sendo comparado com o registrador eax tem algo de especial.

Bruh