En este post la solución a otro de los retos de 'reversing' de la plataforma Challenge Land.
Se trata del reto "Reversing 4" y mi valoración sobre su dificultad es: ★☆☆☆☆.
Su enunciado dice lo siguiente:
Get md5 string and find the word that generates it.
Y nos dan un archivo ejecutable (level4.exe).
Solución: Ejecuto este fichero y se me pide que introduzca un número de serie:
Introduzco una cadena cualquiera de caracteres y dígitos, por ejemplo: abc123, y se muestra un mensaje de error:
Como en retos anteriores de 'reversing' que he puesto en este blog, utilizo OllyDbg y empiezo el análisis buscando todas las cadenas de texto o 'strings' utilizadas en el programa (en la parte superior izquierda de la ventana principal: clic botón derecho, 'Search for' > 'All referenced strings'):
Y obtengo lo siguiente:
Como se observa en la figura anterior, entre las cadenas de texto está el mensaje de error que me ha aparecido al ejecutar el programa: "Wrong.", y también el mensaje que supuestamente aparecerá si introduzco el número de serie correcto: "Well done.". Si hago doble clic sobre este último voy a la parte del código donde se encuentra esta cadena de texto:
Si no entiendo mal el enunciado, el programa obtiene el hash md5 del número de serie que se introduce y éste se compara con el hash md5 del número de serie correcto. Por tanto, una de las cadenas que se pasan como parámetros a la función strcmp que se llama en la dirección 0x004013BA debe corresponderse con el hash md5 del número de serie correcto y la otra con el hash del número de serie introducido.
Pongo un punto de ruptura en la instrucción CALL que llama a dicha función (clic botón derecho sobre ella, 'Breakpoint' > 'Toggle') para que cuando ejecute el programa en modo depuración ('debug mode') éste se detenga en dicha instrucción:
Tras ejecutar el programa en modo depuración, 'Run debugged application (F9)', introduzco otra vez abc123 como número de serie, pulso 'Enter' y el programa se detiene en el punto de interrupción que acabo de colocar.
Veo que el registro EAX contiene la dirección a partir de la cual se almacena un hash md5 y el registro EDX contiene otra dirección a partir de la cual se almacena otro hash md5, y que ambas entran como parámetros a la función strcmp.
Para comprobar si estoy en lo cierto y uno de esos hash md5 se corresponde con el número de serie correcto y el otro con el número de serie introducido, utilizo una de las muchas herramientas online existentes para obtener el texto en claro correspondiente a un hash (siempre y cuando haya suerte, ya que una función hash es de un solo sentido y, por tanto, teóricamente no es reversible):
Como se observa en la figura anterior el primer hash se corresponde con la cadena "orange", mientras que el texto en claro a partir del cual se ha generado el segundo es "abc123" (la cadena que he introducido como número de serie).
Por tanto, si no estoy equivocado el número de serie correcto es "orange". Lo compruebo:
Y para superar este reto sólo me falta introducir esa cadena como solución:
Se trata del reto "Reversing 4" y mi valoración sobre su dificultad es: ★☆☆☆☆.
Su enunciado dice lo siguiente:
Get md5 string and find the word that generates it.
Y nos dan un archivo ejecutable (level4.exe).
Solución: Ejecuto este fichero y se me pide que introduzca un número de serie:
Introduzco una cadena cualquiera de caracteres y dígitos, por ejemplo: abc123, y se muestra un mensaje de error:
Como en retos anteriores de 'reversing' que he puesto en este blog, utilizo OllyDbg y empiezo el análisis buscando todas las cadenas de texto o 'strings' utilizadas en el programa (en la parte superior izquierda de la ventana principal: clic botón derecho, 'Search for' > 'All referenced strings'):
Y obtengo lo siguiente:
Como se observa en la figura anterior, entre las cadenas de texto está el mensaje de error que me ha aparecido al ejecutar el programa: "Wrong.", y también el mensaje que supuestamente aparecerá si introduzco el número de serie correcto: "Well done.". Si hago doble clic sobre este último voy a la parte del código donde se encuentra esta cadena de texto:
Si no entiendo mal el enunciado, el programa obtiene el hash md5 del número de serie que se introduce y éste se compara con el hash md5 del número de serie correcto. Por tanto, una de las cadenas que se pasan como parámetros a la función strcmp que se llama en la dirección 0x004013BA debe corresponderse con el hash md5 del número de serie correcto y la otra con el hash del número de serie introducido.
Pongo un punto de ruptura en la instrucción CALL que llama a dicha función (clic botón derecho sobre ella, 'Breakpoint' > 'Toggle') para que cuando ejecute el programa en modo depuración ('debug mode') éste se detenga en dicha instrucción:
Veo que el registro EAX contiene la dirección a partir de la cual se almacena un hash md5 y el registro EDX contiene otra dirección a partir de la cual se almacena otro hash md5, y que ambas entran como parámetros a la función strcmp.
Para comprobar si estoy en lo cierto y uno de esos hash md5 se corresponde con el número de serie correcto y el otro con el número de serie introducido, utilizo una de las muchas herramientas online existentes para obtener el texto en claro correspondiente a un hash (siempre y cuando haya suerte, ya que una función hash es de un solo sentido y, por tanto, teóricamente no es reversible):
Como se observa en la figura anterior el primer hash se corresponde con la cadena "orange", mientras que el texto en claro a partir del cual se ha generado el segundo es "abc123" (la cadena que he introducido como número de serie).
Por tanto, si no estoy equivocado el número de serie correcto es "orange". Lo compruebo:
Y para superar este reto sólo me falta introducir esa cadena como solución:
Comentarios
Publicar un comentario