Reconozco que soy muy malo resolviendo los retos CTF de tipo ingeniería inversa ('reversing'), pero me he propuesto aprender sobre ellos e iré compartiendo mis progresos, si es que los hay.
En este blog ya puse un post con la solución a un reto de 'reversing', titulado: Solución Reto Cybercamp "Oh my G0d!", en el que nos daban un fichero compilado de python (.pyc) y en el que para obtener la flag utilicé un decompilador de ese lenguaje de programación.
En el reto de este post, titulado "LoseYou", nos dan un fichero comprimido (rev200.zip) que contiene dos archivos (task2.bin y task2.exe).
Mi valoración sobre su dificultad es: ★☆☆☆☆. Ya he dicho que soy muy malo resolviendo este tipo de retos y no se trata de empezar con retos difíciles :).
Solución: Ejecuto el archivo task2.exe.
Se nos pide que introduzcamos un número (incluyo 0), y tras pulsar 'Enter' se nos muestra un mensaje de error en el que se nos indica el número correcto y se nos dice que probemos de nuevo.
Para resolver este reto utilizo OllyDbg, uno de los desensambladores y depuradores más populares, es decir, un programa que obtiene código ensamblador a partir de código máquina y, por tanto, una herramienta de ingeniería inversa ('reverse engineering') muy útil cuando no se dispone del código fuente, y que además es un depurador ('debugger') de código, lo que nos servirá para ir probando el código y poder modificarlo a nuestra conveniencia.
Abro task2.exe con OllyDbg y, en la parte superior izquierda de la ventana principal (donde se muestra el código en ensamblador), busco todas las cadenas de texto o 'strings' utilizadas en el programa (clic botón derecho, 'Search for' > 'All referenced strings'):
Y obtengo lo siguiente:
Como se observa en la figura anterior, vemos el mensaje de error que nos ha aparecido al ejecutar el programa: 'Fail... The number was...', y el mensaje que supuestamente aparecerá si introducimos el número correcto: 'You... you... win??? so lucky! Grab the flag:...'. Si hacemos doble clic sobre este último vamos a la parte del código donde se encuentra esta cadena de texto:
Dos líneas más arriba vemos la instrucción CMP de ensamblador. Esta instrucción compara dos operandos, en este caso el contenido de los registros EAX y ECX, y si son iguales se activa la flag Z, ya que la resta de ambos operandos sería cero y esta flag o bandera se activa (se pone a 1) cuando se ejecuta una instrucción y su resultado es cero.
Pongo un punto de interrupción ('breakpoint') en esa instrucción CMP (clic botón derecho sobre ella, 'Breakpoint' > 'Toggle') para que cuando ejecutemos el programa en modo depuración ('debug mode') éste se detenga en dicha instrucción:
Y ahora ejecuto el programa en modo depuración:
En ese momento:
Se nos pide que introduzcamos un número (incluyo 1), y tras pulsar 'Enter' el programa se detiene en el punto de interrupción que he puesto antes:
Justo debajo de la parte de la ventana principal donde se muestra el código en ensamblador se ve el contenido de los registros ECX y EAX que se comparan en la instrucción CMP.
Ahora, veo que ocurriría si ejecuto la siguiente línea de código:
La instrucción en esta línea es JNE (equivalente a JNZ), es decir, un salto condicional a la dirección indicada (en este caso 0040139C) si el resultado de la instrucción anterior es diferente de cero (en nuestro caso si ECX y EAX son diferentes) o, lo que es lo mismo, si la flag Z está desactivada (es igual a 0). En nuestro caso, como ECX y EAX son distintos, se produce el salto a la dirección establecida:
Como se ve en la figura anterior, tras el salto a la dirección indicada se mostraría el mensaje de error.
Para evitar esto, es decir, evitar que salte y conseguir que el flujo del programa se dirija al mensaje que aparecería si introdujeramos el número correcto, podemos modificar la instrucción JNE por su contraria (JE o JZ, salto condicional si el resultado de la instrucción anterior es cero - en nuestro caso si EXC y EAX son iguales - o, lo que es lo mismo, si la flag Z está activada - es igual a 1), de la siguiente manera:
Como se ve, ahora, como ECX y EAX son distintos, no se produce el salto a la dirección indicada y el programa continuará para mostrar el mensaje con la flag del reto:
Por tanto, la solución a este reto es: oh_you_cheat3r.
En este blog ya puse un post con la solución a un reto de 'reversing', titulado: Solución Reto Cybercamp "Oh my G0d!", en el que nos daban un fichero compilado de python (.pyc) y en el que para obtener la flag utilicé un decompilador de ese lenguaje de programación.
En el reto de este post, titulado "LoseYou", nos dan un fichero comprimido (rev200.zip) que contiene dos archivos (task2.bin y task2.exe).
Mi valoración sobre su dificultad es: ★☆☆☆☆. Ya he dicho que soy muy malo resolviendo este tipo de retos y no se trata de empezar con retos difíciles :).
Solución: Ejecuto el archivo task2.exe.
Se nos pide que introduzcamos un número (incluyo 0), y tras pulsar 'Enter' se nos muestra un mensaje de error en el que se nos indica el número correcto y se nos dice que probemos de nuevo.
Para resolver este reto utilizo OllyDbg, uno de los desensambladores y depuradores más populares, es decir, un programa que obtiene código ensamblador a partir de código máquina y, por tanto, una herramienta de ingeniería inversa ('reverse engineering') muy útil cuando no se dispone del código fuente, y que además es un depurador ('debugger') de código, lo que nos servirá para ir probando el código y poder modificarlo a nuestra conveniencia.
Abro task2.exe con OllyDbg y, en la parte superior izquierda de la ventana principal (donde se muestra el código en ensamblador), busco todas las cadenas de texto o 'strings' utilizadas en el programa (clic botón derecho, 'Search for' > 'All referenced strings'):
Y obtengo lo siguiente:
Como se observa en la figura anterior, vemos el mensaje de error que nos ha aparecido al ejecutar el programa: 'Fail... The number was...', y el mensaje que supuestamente aparecerá si introducimos el número correcto: 'You... you... win??? so lucky! Grab the flag:...'. Si hacemos doble clic sobre este último vamos a la parte del código donde se encuentra esta cadena de texto:
Dos líneas más arriba vemos la instrucción CMP de ensamblador. Esta instrucción compara dos operandos, en este caso el contenido de los registros EAX y ECX, y si son iguales se activa la flag Z, ya que la resta de ambos operandos sería cero y esta flag o bandera se activa (se pone a 1) cuando se ejecuta una instrucción y su resultado es cero.
Pongo un punto de interrupción ('breakpoint') en esa instrucción CMP (clic botón derecho sobre ella, 'Breakpoint' > 'Toggle') para que cuando ejecutemos el programa en modo depuración ('debug mode') éste se detenga en dicha instrucción:
Y ahora ejecuto el programa en modo depuración:
Se nos pide que introduzcamos un número (incluyo 1), y tras pulsar 'Enter'
Justo debajo de la parte de la ventana principal donde se muestra el código en ensamblador se ve el contenido de los registros ECX y EAX que se comparan en la instrucción CMP.
Ahora, veo que ocurriría si ejecuto la siguiente línea de código:
La instrucción en esta línea es JNE (equivalente a JNZ), es decir, un salto condicional a la dirección indicada (en este caso 0040139C) si el resultado de la instrucción anterior es diferente de cero (en nuestro caso si ECX y EAX son diferentes) o, lo que es lo mismo, si la flag Z está desactivada (es igual a 0). En nuestro caso, como ECX y EAX son distintos, se produce el salto a la dirección establecida:
Como se ve en la figura anterior, tras el salto a la dirección indicada se mostraría el mensaje de error.
Para evitar esto, es decir, evitar que salte y conseguir que el flujo del programa se dirija al mensaje que aparecería si introdujeramos el número correcto, podemos modificar la instrucción JNE por su contraria (JE o JZ, salto condicional si el resultado de la instrucción anterior es cero - en nuestro caso si EXC y EAX son iguales - o, lo que es lo mismo, si la flag Z está activada - es igual a 1), de la siguiente manera:
Como se ve, ahora, como ECX y EAX son distintos, no se produce el salto a la dirección indicada y el programa continuará para mostrar el mensaje con la flag del reto:
Por tanto, la solución a este reto es: oh_you_cheat3r.
Comentarios
Publicar un comentario