[Reversing] ctos1 #HackTheFDI

Vamos con el segundo reto de reversing, en este caso el binario es el ctos1 contenido en el zip de reversing.

Como en el reto anterior ctos0, con el comando file vemos que es un binario para sistemas UNIX de 64 bits, por lo que procedo a ejecutarlo en Linux para saber que pide.

ctos1_prog

Vemos que el funcionamiento del programa es el mismo que el anterior, nos pide una contraseña y se produce un delay de unos 5 segundos, por lo que también descartamos el uso de fuerza bruta.

Para este reto voy a usar gdb con peda que es un script en python que facilita la tarea a la hora de hacer reversing o exploiting.

$ gdb -q ./ctos1

ctos1_pdisass

Al desensamblar el binario podemos ver como el modulo de peda colorea las llamadas a funciones, saltos, comparaciones … para poder diferenciarlos rápidamente.

Se pueden distinguir varias funciones interesantes como:

my_getpass

obfuscate

strncmp

Lo primero que voy a comprobar es la función strncmp, la cual es la que compara si la contraseña introducida es correcta o no. Para ello ponemos un breakpoint justo en dicha función para poder examinar los parámetros que le son pasados y así poder ver si damos con la contraseña.

ctos1_strncmp

Vemos como con el módulo peda al correr el binario muestra dos zonas, la de las instrucciones actuales en ejecución y la del contenido del Stack.

Al mostrar los valores de los parámetros de la función strncmp almacenados en los registros rcx y rax vemos que las string tienen un formato extraño y a parte no concuerda con la contraseña que hemos introducido (“AAAA”), por lo que seguramente nuestra contraseña antes de compararla pase por la función obfuscate.

Para no perder mucho tiempo desensamblando la función obfuscate para ver como modifica la contraseña, directamente ponemos un breakpoint en el salto después de la función strncmp para así alterar el flujo del programa y que nos muestre la flag.

ctos1_call

En este caso el breakpoint lo asignamos a la dirección de memoria main+252, para que cuando se pare la ejecución ahí, como la comparación de la contraseña que introducimos con la original no va a coincidir, el salto (jne) irá a la dirección de memoria 0x400d7f, ahí es donde nosotros cambiaremos en el registro rip (siguiente instrucción a ejecutar) la siguiente instrucción, que sería la que se ejecutaría si coincidiera la contraseña (dirección de memoria 0x400d44).ctos1_done

Como se puede ver simplemente modificando el registro rip podemos alterar el flujo del programa y así bypasear la contraseña del programa, obteniendo así la flag: PSRPSRPS

 

Esta entrada fue publicada en CTF, HackTheFDI, Reversing. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s