Miscellaneous

domingo, 3 de julio de 2016

Aprendiendo el aeiou de radare2

En esta entrada les voy a compartir el aeiou de radare2, es decir, hablare acerca de algunos comandos que ahorraran la curva de aprendizaje a aquellas personas que se están animando a entrar al mundo del reversing y cuya opción para desensamblar, depurar, analizar y manipular archivos binarios fue nada más y nada menos que radare2, herramienta de código abierto que tiene la capacidad de ejecutarse desde una terminal y ofrecer unos resultados más que satisfactorios, pero bueno, basta de tanto blah, blah, blah y pasemos a lo que corresponde.

Antes que nada debemos tener instalado radare2, cuya ultima versión esta disponible en su repositorio GitHub. Y bueno, como soy una persona que cree que la mejor forma de aprender es de manera practica, usare este ejecutable (ccf58978584aacfed3ea9917e153e36b) para ejemplificar todos los comandos que mencionare enseguida.

Comando de ayuda y evaluación matemática ( ? )

 

Este comando es uno de los más simples y mi favorito, ya que radare2 tiene un comando asignado para cada letra del alfabeto, es decir, de la a-z, memorizar y recordar cada uno, es algo muy difícil, pero tranquil@s porque basta con incluir al final de un comando el símbolo ?, para obtener una descripción de lo que hace dicho comando específicamente, pero bueno, dijimos que pondremos en practica lo que se menciona en esta entrada, así que carguemos el ejecutable en radare2 usando el comando r2.



Como podemos ver el comando por si solo nos arroja una descripción de todos los comandos básicos de r2, pero si probamos ahora con a? se mostrara solo la ayuda para el comando a específicamente:


Además de ser un comando para obtener ayuda, también sirve como comando de evaluación matemática, y lo vemos claramente en la siguiente imagen:

Nótese el espacio que hay después del signo ?, si se omite, el comando se interpretara como comando de ayuda.

Comandos para obtener información del fichero



Radare2 cuenta con algunos comandos que permiten conocer información de un archivo binario, entre estos comandos se encuentran:

iI -> Comando que nos lista gran cantidad de información acerca del archivo binario, entre esa información se encuentran, el tipo de binario, arquitectura, lenguaje, estado de las contra-medidas vs exploiting, etc.


Si solo necesitamos conocer un valor especifico, podemos usar el operador ~ seguido de iI para buscar coincidencias como lo hace el comando grep en linux, es decir, si solo queremos saber el tipo de binario que es nuestro fichero usamos iI~bintype, o si queremos saber si tiene activado el bit nx usamos iI~nx:


ii -> Este comando nos muestra información de todos los objetos que son importados por el archivo binario:

Nuestro ejecutable realiza 3 importaciones y printf es una de ellas.

il -> Nos lista las librerías que utiliza nuestro archivo binario:

ie -> Este comando nos muestra el punto de entrada del archivo binario, es decir, la dirección de la primera instrucción que se ejecuta:

iM -> Parecido al comando anterior pero esta vez lo que se obtiene es la dirección de main:


is -> Lista todos los símbolos del binario:

iz -> Con este comando obtenemos una lista de las strings que contiene el archivo binario:

 

Comandos de búsqueda 


Radare2 también cuenta con una serie de comandos de búsqueda, entre los más útiles se encuentran:

/ string -> Este comando nos lista todas las direcciones en las que se encuentra una coincidencia con la string que se pasa como parámetro:

/a instrucción -> Es un comando que permite conocer todas las direcciones en las que se encuentra una coincidencia con la instrucción en ensamblador que se pasa como parámetro, es decir, si queremos listar todas las instrucciones jmp eax que contiene el fichero binario tendríamos que usar /a jmp eax:



/A tipo_de_instrucción-> tiene un comportamiento muy similar al comando anterior, solo que esta vez se obtiene la lista de direcciones que coinciden con el tipo de instrucción que se paso como parámetro, en otras palabras, si nosotros queremos obtener los saltos (jmp) que se encuentran en el desensamblado del fichero binario, tenemos que usar /A jmp, aunque no lo parezca, este es un comando muy diferente al anterior, ya que /a jmp eax solo lista las direcciones donde se encuentra un jmp eax exactamente, mientras que /A jmp lista cualquier tipo de salto que se encuentre en el archivo binario, es decir, jmp eax, jmp ebx, jmp ecx, jmp edx, etc.

/R [filter] -> Este comando es muy útil para un exploiter (Creador de exploits), ya que muestra un listado de gadgets ROP, es decir, conjunto de instrucciones que finalizan con la instrucción RET, JMP, o CALL y que al ser enlazadas pueden facilitar la creación de un exploit funcional:

iS | grep perm=..w -> Con esta instrucción se obtiene un listado de todas las secciones del archivo binario en las que se permite la escritura:


iS | grep perm=...x -> Similar a la instrucción anterior, pero esta vez se listan las secciones del binario que son ejecutables:


 

Comandos para análisis,desensamblado,búsqueda de referencias, manejo de funciones, argumentos y variables locales


aaa -> Este comando analiza todo y auto-nombra las funciones, es el primer comando que debemos ejecutar antes que todos los que se mencionan enseguida.

afl -> Nos lista todas las funciones que fueron analizadas por el comando aaa:


s [nombre_función|dirección_función] -> Para poder abordar o posicionarnos en alguna de las funciones que lista afl podemos usar este comando, es decir, si queremos abordar la función sym.main tenemos dos posibilidades y son las siguientes:


algo parecido debe usarse si la función que queremos abordar es sym.aeiou:


podemos ver que lo único que cambio fue el nombre y la dirección de la función.

pdf -> Este comando desensambla la función que abordamos usando el comando s, es decir si ejecutamos s sym.main y después ejecutamos el comando pdf lo que obtendremos sera el código  desensamblado de dicha función:


pdf@[nombre_función|dirección_función] -> Si queremos ahorrarnos el uso del comando s, o no tenemos la intención de abordar una función diferente a la que actualmente estamos abordando podemos usar este comando, he aquí un ejemplo:


Ahora bien, si lo que se desea es solamente obtener una N cantidad de lineas del código desensamblado, podemos optar por usar pd [N]@[función_name]:


axt [nombre_función] -> Este comando nos muestra las referencias que existen hacia una función, es decir, instrucciones en código ensamblador desde las cuales es llamada una función, por ejemplo, si queremos saber las direcciones desde las que se efectúa una llamada a printf podemos usar axt sym.imp.printf:


En la imagen podemos observar que en nuestro fichero binario se efectúan 3 llamadas a la función printf (en las direcciones 0x400582, 0x400560 y 0x400544) para comprobar que esto es correcto, podemos hacer uso del comando pd que ya mencionamos anteriormente:



Y en efecto, en esas 3 direcciones se efectúa una llamada a la función printf.


afa -> Si queremos conocer los argumentos de una función tenemos que usar este comando, por ejemplo, si queremos conocer los argumentos de la función sym.aeiou debemos hacer lo que se muestra a continuación:


afv -> Este comando ofrece también un listado, solo que esta vez lo que se lista son las variables locales de la función:


afn new_name_function->  Con esta instrucción podemos cambiar el nombre de una función:


afan old_name new_name-> Si lo que se desea es renombrar algún argumento de la función podemos usar este comando:



afvn old_name new_name-> Sirve para renombrar las variables locales de una función:


gráficos y comentarios
 

Como no podía faltar, radare2 también nos ofrece un ambiente más ameno y cómodo llamado visual mode, que si bien no es nada cercano a una GUI, si que puede ser algo mucho más sencillo de usar que la CLI una vez te acostumbras. 

para acceder a este modo solo basta con tipear el comando V, de igual manera que en la CLI el comando ? nos muestra la ayuda para este modo:



Y bueno ahí esta, no entrare en detalle con cada uno de los comandos pero si mencionare uno de los comandos que más util nos puede ser y ese es:

VV@[function_name] -> Este comando nos muestra un gráfico (ascii art) de una función, por ejemplo, si queremos ver el grafico de la función sym.aeiou usamos VV@sym.aeiou y obtendremos algo como esto:

Al momento de estar visualizando el gráfico disponemos de algunos atajos de teclado que podemos obtener al oprimir ?, algunos de estos atajos son:
  • asdw -mueve el grafo completo
  • hjkl - mueve un nodo (también podemos usar las teclas de dirección)
  • tab/TAB - selecciona next/previous node
  • t/f -Sigue camino verdadero/falso
  • . -centra el gráfico
  • q -salir
Y bueno ya para terminar este extenso recorrido aprendamos algo sobre los comentarios en radare2:

CC -> Nos lista todos los comentarios que contiene nuestro fichero objeto.


¿y si lo queremos es agregar un comentario? simple, solo basta con usar el comando s para posicionarnos en la dirección donde queremos agregar el comentario y después usar CC [Comentario] y listo:


Como vemos en la imagen lo que se hizo primero fue abordar la dirección 0x004004ef para después agregar el comentario "llamada a función aeiou" en dicha dirección usando CC, otra manera de obtener el mismo resultado es usar el comando CCu [Comentario]@[addr]:



Y bueno, eso es todo... claro que no son todos los comandos ni mucho menos todas las posibilidades que ofrece este excelente framework llamado Radare2, pero espero que sirva de algo a aquellos que recién se inician a experimentar con el, sin más que decir, happy hacking :).