sábado, 15 de septiembre de 2018

Desarrollando habilidades con radare2


Siempre me ha gustado buscar el modo geek de las herramientas que utilizo fue por ello que decidí mudarme a Linux desde hace tiempo, actualmente estudio lenguaje ensamblador porque me interesa incursionar el análisis de malware; para ello es necesario el uso de diferentes herramientas que nos permiten efectuar los tres pasos básicos de la ingeniería inversa:

1. Recopilar información
2. Desensamblar
3. Depurar

Sin embargo, antes de llegar a esos pasos es necesario tener unos buenos conocimientos sobre el Lenguaje Ensamblador, el cual nos permite comprender el código que ejecuta la maquina para realizar las tareas que se le han asignado.

No pretendo aún enseñar Ensamblador, pero si escribir sobre mi experiencia en el aprendizaje de dicho lenguaje.

En esta ocasión escribiré sobre una característica del debugger radare2, la cual nos permite probar bloques de código en ensamblador, algo que puede ser útil en diferentes circunstancias, para ello abrimos el debugger con el parámetro ( - ) el cual carga un archivo vacío en memoria, en el que podemos realizar nuestras pruebas:

r2 -

Podemos pasar al modo visual para estar seguros del código que estamos generando y para lo cual usamos el comando:

vpp





Nota: Para escribir comandos en el modo visual usamos la tecla ( : ) para visualizar el prompt y poder insertar los comandos.

A continuación se puede proceder a escribir nuestras líneas de código, para ello tenemos varias opciones de las cuales se describen algunas a continuación:

wa    ‘mov    al, 0x7F’

El comando anterior escribe los opcodes de la instrucción que se le pasa como parámetro, en este caso los opcodes generados son: ( B07F ), sin embargo, se debe tener en cuenta que la instrucción no realiza desplazamiento alguno con respecto a la ubicación en que nos encontramos por ello es necesario usar el comando ( s ) para movernos la cantidad de bytes necesarios:

s 2

Repetimos los pasos anteriores para continuar escribiendo nuestro programa:

wa    ‘inc    al’

Es necesario tener en cuenta que en ocasiones el programa modifica nuestras instrucciones ajustándolas a lo que le parece conveniente por lo que esta instrucción en mi caso genero el opcode ( FFC0 ) los cuales corresponden a la instrucción ( inc    rax ) es en estos momentos donde puede entrar en escena otra utilidad que hace parte del paquete llamada rasm2, la cual podemos ejecutar sin salir del programa, esto mediante el carácter ( ! ) seguido del programa que queremos ejecutar en este caso rasm2 con el cual podemos verificar opcodes e instrucciones, usando entonces el programa rasm2 vemos que el opcode que necesitamos es:

$ !rasm2    ‘inc    al’
FEC0

para cambiar el opcode podemos hacerlo de dos formas:

- ubicándonos en el byte que queremos cambiar mediante ( s ) y luego usando el comando ( wx ) y el valor hexadecimal que queremos escribir así:

:> s3; wx FE

Nota: El punto y coma nos permite escribir varias instrucciones en una sola linea.

- Otra forma es haciendo uso del modo cursor mediante la tecla ( c ) y luego las teclas ( HJKL ) para ubicarnos en el byte a modificar, pulsar la tecla ( i ) para entrar en el modo de inserción y escribir el valor en hexadecimal.

El par de instrucciones escritas hasta el momento nos sirven para activar la bandera de signo y desbordamiento, por lo que usaremos un salto condicional para regresar a nuestro inicio para ello usamos:

:> s5; wa js 0

Dejar la instrucción anterior en un byte impar puede hacer que el debugger se desalinie con las instrucciones por lo que podríamos insertar un NOP en el byte 0x5, consultamos el opcode de la instrucción NOP mediante rasm2 y desplazar nuestro salto un byte mas adelante, para ello podemos usar el comando ( wen ) seguido del numero de bytes que queremos insertar:

:> !rasm2 ‘NOP’
90
:> s5; wen 1; wx 90

Podemos también insertar un código para desactivar la bandera de desbordamiento así:

:> !rasm2 ‘or al, 0’
C000
:> weX 6 C000

Nota: El comando weX permite insertar en determinada posición un valor hexadecimal.

Al efectuar los procedimientos anteriores vemos como el salto ha modificado su valor y ya no regresa al inicio, para ajustarlo describiré una técnica poco convencional pero que nos servirá para probar otro programa, la técnica consiste en que el opcode del salto se compone de dos elementos el opcode de la instrucción de salto que es ( 78 ) y la cantidad de bytes que debe regresar que este caso son 0xA, entonces usamos el programa rax2 para verificar el numero en hexadecimal que debemos usar en el salto:

:> !rax2 -10
0xfffffffffffffff6
:> s9; wx f6

Ahora podemos ejecutar nuestro código paso a paso mediante la tecla ( s ) y de ser necesario podemos usar el comando ( dr ) para asignar el valor de alguno de los registros como en el siguiente caso:

:> dr rip=0



Es todo por el momento, espero que esta información sea útil para quienes estén mas al principio de lo que me encuentro.

No hay comentarios.:

Publicar un comentario