viernes, 29 de abril de 2011

WriteUp - Desafío 9 - H4ckc0nt3st GSIC 2011

Este desafío nos ofrece un binario llamado RegMe.

En primer lugar probamos el ejecutable y observamos que pide dos datos, USER y REGISTER. Introduciendo datos al azar nos dice “ERROR DE REGISTRO!!!”. Dejando los campos en blanco nos indica el significado de los campos con el mensaje “Debes introducir un nombre y una clave de registro válida”.

Lo abrimos con el IDA Pro Free para observar el código ensamblador y analizarlo. La vista de grafo nos permite observar fácilmente el flujo del programa, y los distintos puntos de salida correspondientes a los trucos anti-debug. Para acelerar la localización del punto que nos interesa revisamos las cadenas del binario y vamos a la referencia a “Solucionado!!! la clave es: %s”. Analizamos el código alrededor de este punto…

Observamos la introducción de los datos y dónde los guarda:



Se realiza un hash SHA1 del usuario introducido y se inicializan variables para un bucle:



En cada vuelta del bucle coge un byte del hash calculado, hace un AND con 0xEE, lo pone en hexadecimal y lo compara con 2 caracteres de la cadena de registro introducida por el usuario.



Si coinciden, va al bloque en el que muestra la clave, por lo que deducimos que el número de registro debe ser el hash SHA1 del usuario “ANDeado” byte a byte con 0xEE y puesto en hexadecimal.

Calculamos el hash SHA1 de la cadena “yo”:
# echo -n yo > prue
# sha1sum prue
c41975d1dae1cc69b16ad8892b8c77164e84ca39 prue

Y realizamos el AND para obtener la cadena de registro con el siguiente script:
import hashlib
import binascii
from itertools import cycle, izip

def miand (ss, key):
key = cycle(key)
return ''.join(chr((ord(x) & ord(y))%256) for (x,y) in izip(ss, key))

mihash='c41975d1dae1cc69b16ad8892b8c77164e84ca39'
binascii.hexlify(miand(binascii.unhexlify(mihash),'\xee'))



Obtenemos la siguiente cadena:

'c40864c0cae0cc68a06ac8882a8c66064e84ca28'


Introduciendo el usuario y su correspondiente registro obtenemos la clave:

# ./RegMe
USER: yo
REGISTER: c40864c0cae0cc68a06ac8882a8c66064e84ca28
Solucionado!!! la clave es: anamanaguchi





Solución más rápida


La solución más rápida pasaría por evitar la comprobación del registro llevando el flujo al bloque en el que muestra la clave. En nuestro caso, bastaría con nopear el salto condicional que se ve en el bloque básico siguiente:





Para ello, con un editor hexadecimal cambiamos en el fichero binario los bytes 0F 8E 4C FF FF FF por 90 90 90 90 90 90.


Ejecutándolo con cualquier dato conseguimos la solución:


# ./RegMe
USER: aaa
REGISTER: aaa
Solucionado!!! la clave es: anamanaguchi

No hay comentarios:

Publicar un comentario