[Microcorruption] Resolviendo el CTF de Nueva Orleans con un poco de jazz

Hola chicos y chicas! Vamos a comenzar esta serie de posts en la que voy a ir resolviendo los diferentes niveles de Microcorruption. Ya os presenté la página en el post anterior.

Voy a dar por hecho de que ya habéis pasado por el tutorial y estáis ligeramente familiarizados con el entorno de depuración  y las opciones que nos ofrece. O al menos, cómo movernos por el.

Poniéndonos en situación

Antes de ponernos manos a la obra, vamos a ponernos un poco en situación. Nos hemos trasladado a Nueva Orleans con parte del equipo de operaciones. Así que vamos a ambientarnos con un poco de música del lugar:

Ahora que estamos ambientados, vamos a ello. Primero analicemos que tenemos entre manos. Echándole un ojo al manual de instrucciones de LockIT Pro, podemos ver que las instrucciones corresponden con un microcontrolador MSP430. Así que aparte de la útil información del manual, también tenemos un resumen de las instrucciones y direccionamiento de memoria en este enlace.

Primera lectura

Este primer caso es el más sencillo de todos. Haciendo una lectura rápido del código y las etiquetas, tenemos las siguientes llamadas a funciones dentro del main (dirección 4438) :

  • 443c: create_password
  • 444a: get_password
  • 4450: check_password

Con esa información, ya tenemos algo prometedor. Vamos directamente a ver el contenido de check_password. Lo primero que llama la atención es la comparación de la dirección 44c2

44c2: ee9d 0024        cmp.b        @r13, 0x2400(r14)

Esta instrucción realiza una comparación de un solo byte (cmp.b) en la dirección contenida en el registro r13 (439a) y la dirección 2400 más el desplazamiento que haya en r14. Que si es la primera ejecución, será 0.

Hora de ejecutar

Vamos a poner un punto de ruptura en esta instrucción y lanzar la primera ejecución. Introducimos una contraseña cualquiera. A continuación  vamos a examinar un poco más al detalle estas direcciones cuando se pare en el punto de ruptura. encontraremos que el registro r13 (439a) coincide con el valor del puntero de la pila (sp). Y al comprobar el contenido en la sección de memoria, veremos que apunta justo a nuestra contraseña.

Podemos ver cómo se almacena la contraseña que hemos introducido en memoria

Ya tenemos localizado un dato importante. En los siguientes retos, la primera tarea a realizar (al menos así lo hago yo) es localizar donde se guarda la información que introducimos.

Ahora echemos un vistazo a la dirección en memoria 2400. ¡Vaya! ¿Qué tenemos aquí?. Esta serie de caracteres pueden ser una buena candidata a contraseña.

Esto parece que puede ser muy interesante

Vamos a copiarla en un bloc de notas. A partir de  esta instrucción veremos que el siguiente paso, una instrucción jne (Jump Not Equal) que realizará el salto y nos sacará de la función. Así que le damos a continuar para que termine esta ejecución con un mensaje de contraseña incorrecta.

Abrete sésamo

Hasta ahora, tenemos localizada la contraseña que introducimos, un punto donde se realiza una comprobación susceptible de ser la fundamental y lo que podría ser la contraseña final. Es el momento de lanzar otra ejecución y probar la clave que hemos encontrado. Cuando la ejecución vuelva a pararse en el punto de ruptura, comenzaremos a andar paso a paso. Esta vez veremos que no realiza el salto condiciona, sino que continúa hasta el siguiente salto que si lo realiza, pero esta vez volviendo a una instrucción superior. Parece que hemos entrado en un bucle. Además si prestamos atención a la comparación en 44ca, veremos que está comparando el literal 8 con el contenido en el registro r14. Registro que se va incrementando en cada ejecución del bucle. Y el literal coincide con el tamaño de nuestra clave candidata -1. Muchas coincidencias.

Así que le damos a continuar y…

Parece que funciona, ahora sólo hay que probarlo en producción

¡Voila! Aquí lo tenemos.

Conclusión

Ahora, con nuestro dinerito en el bolsillo, podemos realizar una pequeña retrospectiva sobre este reto. Sólo ha sido una pequeña introducción, pero nos sirve para familiarizarnos  un poco más con el entorno y algunas instrucciones. El resto no será tan fácil. Pero de momento podemos disfrutar de nuestro éxito.

¡Nos vemos en Sidney!

Entradas

  1.  Mi primer CTF. Practicando ensamblador con microcorruption
  2.  Resolviendo el CTF de Nueva Orleans a Ritmo de Jazz
  3. Sidney, entre canguros anda el juego

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *