Introducción al reversing en ARM con una Raspberry Pi parte 1

Recomendaciones
Para poder entender la siguiente serie de entradas, se recomienda conocer reversing en x86 o x64 y un manejo básico de IDA o GDB.
¿Qué es ARM?

Es una arquitectura RISC (Conjunto Reducido de Instrucciones) de 32 bits y, con la llegada de su versión V8-A, también de 64 Bits. Un enfoque de diseño basado en RISC permite que los procesadores ARM requieran una cantidad menor de transistores que los procesadores x86 CISC, típicos en la mayoría de computadores personales.

Configuración de la Raspberry Pi

El primer paso necesario para la utilización de la Raspberry Pi es la instalación de un sistema operativo (SO), en este caso se utilizará Raspbian el cual puede ser descargado desde la página oficial de Raspberry Pi. Una vez descargado el SO, este debe ser instalado en una microSD, para ello basta con seguir los pasos descritos en la documentación oficial.

Conexión entre Raspberry Pi y máquina virtual

Para facilitar la comunicación entre máquinas se sugiere una conexión física por cable RJ45 entre la máquina virtual y Raspbian por medio de SSH.

Debido a que mi MacBook Pro no dispone de una conexión Ethernet, se utilizó un adaptador Ethernet2USB (ASIX AX88772A) y otra entrada USB como alimentación de carga para la Raspberry Pi.

Establecer una nueva clave a la cuenta “pi“:

passwd

Configurar Raspbian para iniciar automáticamente el servicio SSH:

systemctl enable ssh

Configurar IP fija en Raspbian:

ifconfig eth0 add 192.168.2.2 netmask 255.255.255.0

Configurar gateway por defecto en Raspbian:

route add default gw 192.168.2.2

Para guardar los cambios de forma permanente aun cuando Raspbian es reiniciado, se debe modificar /etc/dhcpcd.conf y adicionar el siguiente contenido al final del archivo:

interface eth0
static ip_address=192.168.2.2/24
static routers=192.168.2.2
static domain_name_servers=192.168.2.2

Configurar IP y submáscara de red en la máquina virtual:

Si se ha configurado todo de forma correcta, por medio del cliente SSH PuTTY podremos conectarnos desde la máquina virtual hacia la Raspberry Pi sin requerir de un teclado y/o monitor.

Para subir archivos desde Windows hacia la Raspberry Pi, se debe utilizar WinSCP y desde GNU/Linux el comando scp. Con todos los pasos mencionados anteriormente ya es posible crear nuestro primer “Hola mundo!” en lenguaje ensamblador ARM.

Hola mundo!

Por medio de scp o WinSCP creamos el archivo “hola.s” e ingresamos el siguiente código:

.data

msg: .ascii "Hola mundo!\n"
len = . - msg

.text

.global main

main:
    /* syscall write(int fd, const void *buf, size_t count) */
    mov     r0, #1     @ fd -> stdout
    ldr     r1, =msg   @ buf -> msg
    ldr     r2, =len   @ count -> len(msg)
    mov     r7, #4     @ write is syscall #4
    swi     #0         @ invoke syscall
   
    /* syscall exit(int status) */
    mov     r0, #0     @ status -> 0
    mov     r7, #1     @ exit is syscall #1
    swi     #0         @ invoke syscall

Ensamblar código:

as hola.s -o hola.o

Enlazar código:

gcc hola.o -o hola

Ejecutar código:

Depurar código

Existen varias formas para depurar código en ARM, como por ejemplo GDB, GDB Server o IDA. Por simplicidad utilizaremos IDA, para ello, se debe subir y ejecutar el archivo armlinux_server, el cual se encuentra ubicado (en mi caso) en:

C:\Program Files (x86)\IDA 6.8\dbgsrv

El ejecutable a analizar debe encontrarse localmente en la máquina virtual, por lo cual debemos descargar “hola” desde la Raspberry Pi.

A modo de ejemplo, ponemos un BP al inicio de la función main:

Configurar IDA para depurar remotamente:

Configurar las opciones del proceso:

Iniciamos el ejecutable desde IDA y el programa se detendrá en el BP:

Por otro lado, también es posible depurar el ejecutable directamente desde la Raspberry Pi con GDB:

Alternativa Raspberry Pi

Para aquellos que no tienen una Raspberry Pi, pueden descargar una imagen de una máquina virtual de VMware la cual contiene un emulador en QEMU. Esta imagen fue publicada originalmente en Azeria-Labs pero el siguiente enlace contiene una versión levemente actualizada por mi y en español:

Descargar desde Google Drive

# Azeria-Lab-v1.7z hash
MD5 2E49EF429FF20BC21B0ED225AC0D15C9
SHA-1 0EB0E792E2D56887A51831792B32BC65ECD28117

Password de Azeria-Lab-v1.7z: pwnedchile.com

Password de la cuenta user: toor123

Para utilizar la Raspberry Pi virtualizada se deben seleccionar los siguientes iconos en orden ubicados en el Dash to Dock (lado izquierdo de la pantalla):

Bibliografía
Compartir

Agregar un comentario