¿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“:
Configurar Raspbian para iniciar automáticamente el servicio SSH:
Configurar IP fija en Raspbian:
Configurar gateway por defecto en Raspbian:
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:
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:
Enlazar código:
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:
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):
Agregar un comentario
Debes iniciar sesión para comentar.