Reversing 200: University

By Mexihacks Team

Descripción: Encuentra la flag esperada como input

Category: RE
Points: 200

Resolución
1. El archivo que nos dan es de tipo ELF de 64 bits.

user@blackbox:~/Hackdef/RE/2. University$ file university

university: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b6e75e93c56c853540d8479248010ab3c65109df, not stripped

user@blackbox:~/Hackdef/RE/2. University$


2. Le asignamos permisos de ejecución para poder ejecutarlo.

user@blackbox:~/Hackdef/RE/2. University$ chmod +x university

3. Al ejecutar el programa, nos dice que solicita un flag,

user@blackbox:~/Hackdef/RE/2. University$ ./university
Enter your flag:

4. Le pasamos al programa cualquier flag y nos responde con la palabra Nope.

Enter your flag: ABC123
Nope.
user@blackbox:~/Hackdef/RE/2. University$


5. Procedemos a ver el código en ensamblador del programa y su flujo con IDA.

6. Se presenta la siguiente pantalla.



7. Tras analizar el código ensamblador generado por IDA, nos damos cuenta que necesitamos considerar una serie de criterios para ingresar un flag válido, estos se ven y se explican en los siguientes bloques de código.

Primero, el programa es ejecutado, imprime la frase "Enter your flag: " y solicita desde la entrada estándar el flag como se mostro en la figura anterior.

Segundo, el tamaño del flag debe ser de 48 bytes (0x2F + 1), ya que la posición del cero también es considerada, esto se observa en la siguiente comparación.


Tercero, se realiza una operación entre el input ingresado y un buffer llamado flag, el cual es de tamaño 0x30.

El código realiza la operación binaria de tipo not a cada elemento del buffer flag anterior y el resultado de cada operación es comparado con cada carácter del input ingresado.


Si existe al menos un carácter en nuestro flag que no coincida con la operación not anterior, entonces se imprime el mensaje “Nope.”, en caso contrario, se imprime el mensaje "Correct!".



8. Para generar el flag, se procedió a realizar un script en Python, como se muestra a continuación:

#!/usr/bin/env python3
def bit_not(n, numbits=8):
return (1 << numbits) - 1 - n
flag = [0x99,0x93,0x9E,0x98,0x84,0x93,0x0CF,0x0CF,0x8F,0x8C,0x0A0,0x9E,0x91,0x9B,0x0A0,0x87,0x0CF,0x8D,0x8C,0x0A0,0x9E,0x91,0x9B,0x0A0,0x8D,0x9A,0x9E,0x9B,0x8C,0x0A0,0x90,0x0A0,0x92,0x86,0x0A0,0x0CD,0x0CC,0x0CD,0x9D,0x9A,0x0CF,0x0C8,0x0C9,0x0C7,0x9B,0x0CA,0x0C8,0x82];
for i in range(0, len(flag)):
print(chr(bit_not(flag[i])), end="");
print();

El script toma los valores del buffer llamado flag y les aplica una operación not binaria, para saber cuál es el flag que el programa espera.

9. Al ejecutar el script anterior, se obtiene el siguiente flag.

user@blackbox:~/Hackdef/RE/2. University$ python3 university.py

flag{l00ps_and_x0rs_and_reads_o_my_232be0768d57}

user@blackbox:~/Hackdef/RE/2. University$

10. Ingresamos el flag anterior a nuestro programa y se obtiene una respuesta satisfactoria.

user@blackbox:~/Hackdef/RE/2. University$ ./university
Enter your flag: flag{l00ps_and_x0rs_and_reads_o_my_232be0768d57}
Correct!
user@blackbox:~/Hackdef/RE/2. University$


Comments