Ingenieria inversa con Radare

“El objetivo es aprender ingeniería inversa con el Framework Radare2”.

 

Primero, debemos instalar radare, las instrucciones de instalación se encuentranhttps://github.com/radare/radare2

Si clonamos directamente:

Documentación oficial de radare: https://radare.gitbooks.io/radare2book/content/
Información sobre arquitecturas e ingenieria inversa: https://www.aldeid.com/wiki/Category:Reverse-Engineering

Vamos a trabajar sobre la arquitectura x86, con sintaxis intel, debajo podrán encontrar, una imagen con los códigos.

Underc0de - Tabla de codigos Intel

El binario sobre el que trabajaremos es conocido IOLI crackme 0x00 (http://www113.zippyshare.com/v/UTjKTJfG/file.html )

El archivo comprimido contiene un README.TXT que da pistas sobre los niveles, para este nivel utilizaremos la ayuda que nos brinda. Indica que los “strings son nuestras amigas“.

Hay diversas formas de resolver el ejercicio.


Leyendo el readme.txt

El primer método será utilizando strings.

La salida es:

Con listar los strings del binario, conseguimos la contraseña válida.


Rabin2 de Radare .

Con el comando rabin2 llamamos al modulo, con el flag -z buscamos strings en el binario.

Obteniendo el siguiente resultado:

De nuevo, obtenemos la contraseña en texto plano a traves de un analisis estático del binario.


Radare2.

Utilizando exclusivamente radare2, trateremos de obtener la contraseña en texto plano sin debuggear el software y luego veremos como modificar el flujo de ejecucción para que acepte cualquier contraseña como valida.

Ejecutamos radare y analizar completamente el binario:

Dentro de radare con el comando ‘S‘ (sin comillas simples) listamos las secciones del binario. Para más información pueden dirigirse a la documentación oficial de Radare.
El formato del output que da:

  • Numero de sección
  • Offset de inicio
  • Permisos de la seccion
  • Virtual adress (dirección virtual)
  • Size (tamaño)
  • Virtual size (tamaño virtual)
  • Nombre de la sección

Esta información es bastante útil (aunque para esta parte del curso no la usaremos).
Ahora, procedemos a desensamblar la función main.
Antes de eso, ¿por que desensamblamos esa función y no otra?
Como hemos visto en el output de rabin2, como en todos los crackmes hay una zona de chico bueno y chico malo, interesa saber en qué función está localizada la zona de “chico bueno”, para ello usaremos el comando /Password que devuelve:

Una vez que obtenemos la dirección donde esta la zona de ‘chico bueno‘ pedimos a r2 más información sobre esa dirección con el comando axt 0x080485a9

Una vez entendido por qué de desensamblar el main, utilizaremos el comando pdf (print disassembled function).

De nuevo, volvemos a encontrar la contraseña en texto plano.

Al llegar a este punto, viene lo divertido, modificar el flujo de ejecucción.


Modificando el flujo de ejecución.

A simple vista el programa compara dos registros (0x08048469, 0x0804846e) uno es la contraseña que valida al ejercicio y el otro, lo que nosotros hayamos introducido.
La parte que interesa está entre la direccián 0x0804846e y 0x08048480, donde está el string “Password OK “.A grandes rasgos lo que el software hace a partir de la direccion  0x0804846e es lo siguiente:

  • Compara la contraseña introducida con la valida.
  • Si son iguales salta a la direccion 0x08048480
  • Caso contrario, llega hasta la direccion 0x0804847e, que ejecuta un salto incondicional a 0x0804848c  y termina con la ejecucción.

Ahora vamos a modificar ese “si es equivalente…” por un salto incondicional
Tenemos que entender el significado de la siguiente línea, mas concretamente de la segunda columna
0x08048470      740e           je 0x8048480

74 = je (jump if equal)
0e = bytes to jump (1 instruccion == 1 byte)

El objetivo es que la linea anterior se convierta en:
0x08048470      eb0e           jmp 0x8048480

Reabrimos el archivo en modo escritura con el comando oo+

A continuación nos movemos a la dirección donde se encuentra el salto con el comando s 0x08048470 e imprimimos las siguientes 8 instrucciones con el comando pd 8.

Si todo ha salido bien, debería aparecer lo siguiente

Para modificar la condicion, utilizaremos el comando wx seguido de la nueva instruccion wx 0xeb.

Listamos nuevamente 8 instrucciones y observamos como el flujo de ejecucción se ha modificado


Agradecemos a Sadfud por compartir el artículo de Analisis de Malware con Radare


Posts Relacionados

Comments

comments

Deja una respuesta

Tu email no será publicado. Los campos requeridos estan marcados con *
Puedes usar tags HTML y los atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">