Bypass Me writeup

Description
Your task is to analyze and exploit a password-protected binary called bypassme.bin and binary performs input sanitization.
However, instead of guessing the password, you are expected to reverse engineer or debug the program to bypass the authentication logic and retrieve the hidden flag.
You’ll need to think like an attacker using tool like LLDB to uncover how the binary works under the hood and leak the correct password.
Bypass Me solución
Nos conectaremos por SSH como pide el CTF y buscaremos la ruta del archivo:
ssh ctf-player@foggy-cliff.picoctf.net -p 64022

Habiendo visto que está en la raíz, lo descaargaremos con scp:
scp -P 64022 ctf-player@foggy-cliff.picoctf.net:bypassme.bin .

Ahora, al tenerlo en local, podemos examinarlo mejor con ghidra y gdb.
Resolución con ghidra
ghidra
Crearemos un proyecto e importaremos el archivo ‘bypassme.bin’

En el código principal, hay un par de líneas importantes.
En primer lugar, el programa almacena la contraseña que le proporcionamos en la variable ‘buf’:
printf("\n[%d tries left] Enter password: ",attempts);
fflush(stdout);
fgets(buf,0x80,stdin)
Tras esto, lo compara con la variable ‘password’ para ver si imprime por pantalla la flag:
iVar2 = strcmp(buf,password);
if (iVar2 == 0)
Esta variable es usada en la función ‘decode_password’:
decode_password(password);
Si hacemos doble click en ‘decode_password’, veremos el contenido de la función:

Esta función tiene almacenado en el array ‘enc’ una serie de valores en hexadecimal que almacena en el array ‘out’ tras realizar un XOR (^ 0xaa).
Originalmente, el array enc tenía:
f9 df da cf d8 f9 cf c9 df d8 cf
Si realizamos el mismo proceso que realiza el programa en CyberChef, podremos ver en claro el texto contra el que el programa realiza la comprobación:

Resolución con GDB
Lanzamos gdb para inspeccionar el binario:
gdb ./bypassme.bin
Ponemos un breakpoint en la función decode_password que hemos encontrado con ghidra:
b decode_password
Iniciamos la ejecución del programa
run
Alcanzará el breakpoint, ahora finalizamos la función:
finish
Inspeccionamos los registros
info reg
E inspeccionamos la variable que se ha enviado por parámetro a la función:
x/s $rdi
Obtendremos así el mismo resultado:

Al conectarnos a la instancia por SSH de nuevo e introducir la contraseña tras ejecutar el binario completaremos el CTF:

Consultor de ciberseguridad especializado en continuidad de negocio y respuesta ante incidentes. Interesado en analizar tecnologías desde una perspectiva de seguridad y descubrir su comportamiento real.
