Impossible Password es uno de los retos de Reversing existentes actualmente en la plataforma de hacking HackTheBox.
Este reto otorga 30 puntos a quién lo resuelve y es de dificultad media.
Para su resolución lo primero será descargar el fichero zip existente en el mismo y extraer su contenido:
1 2 3 4 |
$ unzip impossible_password.zip Archive: impossible_password.zip [impossible_password.zip] impossible_password.bin password: inflating: impossible_password.bin |
Y comprobamos que tipo de fichero es el binario extraido:
1 2 |
$ file impossible_password.bin impossible_password.bin: 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]=ba116ba1912a8c3779ddeb579404e2fdf34b1568, stripped |
Daremos permisos de ejecución al fichero binario:
1 |
$ chmod +x impossible_password.bin |
Y cargaremos el mismo con radare2 en modo debug:
1 |
radare2 –d imposible_password.bin |
Cargaremos el análisis de flags con “aa” y “aaa” y seguidamente mostraremos las funciones existentes con “afl”.
Cargaremos a continuación la función main con el comando:
1 |
pdf@main |
Y observaremos una primera contraseña “SuperSeKretKey”
Para comprobar que estamos en lo cierto tendremos que acceder a los registros rsi y rdi justo antes de la llamada a strcmp
Crearemos un breakpoint justo antes de la llamada strcmp (db direccion) y verificaremos después el registro (x@registro), para continuar la ejecución utilizaremos el comando “dc”
Tras esto reiniciaremos la ejecución con “ood”
E introduciremos la contraseña obtenida, veremos que nos pide una segunda contraseña que no conocemos
Si examinamos el código de esta operación vemos que hay operaciones de randomización por lo que la opción será establecer un breakpoint en la comprobación posterior (jne 0x400976) y modificar la solución para bypasear esta segunda contraseña. Cerramos el programa y lo ejecutamos de nuevo, pero esta vez en modo debug y escritura.
1 |
radare2 –dw imposible_password.bin |
Llegamos de nuevo hasta la función main y creamos esta vez el breakpoint en esta dirección:
Utilizamos wao en este punto para modifiar el valor a 0
Y listo, tenemos nuestra flag HTB{40b949f92b86b18} para cobrar los puntos.