Desactivando ASLR en una app iOS con Radare2 – Parte 1

Introducción

En este artículo explicaremos cómo podemos desactivar ASLR (Address Space Layout Randomization) en una app iOS. Ya vimos en un artículo anterior cómo podemos comprobar con la herramienta otool si una aplicación iOS tiene activada esta protección o no. Podéis leer el artículo en este enlace.

ASLR, PIE, PAX y Exec Shield

En realidad lo que se comprueba es si el binario ha sido compilado con PIE (Position-Independent Executable). Los binarios de tipo PIE permiten en algunas distribuciones GNU-Linux orientadas a seguridad a hacer uso de PAX y Exec Shield, que son unas implementaciones realizadas a nivel de kernel. Estas implementaciones aumentan la seguridad del sistema, permitiendo por ejemplo el direccionamiento aleatorio de los objetos del programa en memoria, dificultando así posibles explotaciones de vulnerabilidades de tipo buffer overflow, entre otros. Aquí es donde ASLR entra en juego.

La siguiente imagen corresponde a la versión PAX de Tux. 😉

170px-pax_tux

Para evitar confusiones, aunque la finalidad es deshabilitar el direccionamiento aleatorio (ASLR), nos referiremos a PIE, ya que así es como se refleja el flag en el binario que vayamos a analizar. De hecho, con otool el resultado del análisis se muestra de la siguiente forma.

Comprobar PIE con otool

Se puede observar a la derecha de la imagen que el binario analizado muestra el flag PIE activado.

Radare2

Este magnífico framework de ingeniería inversa creado por Sergi Álvarez (@pancake), que surgió como una herramienta de forense, actuando como un editor hexadecimal capaz de abrir archivos de disco. A día de hoy cuenta con un interesante arsenal de utilidades que permiten analizar binario, desensamblar código, depurar programas o hacer depuración remota a través de servidores gdb.

Podéis encontrar toda la información en el siguiente enlace: https://github.com/radare/radare2

A título personal decir que, aunque la curva de aprendizaje es alta, es un framework que merece la pena conocer, estudiar y usar, sobre todo si te dedicas a ingeniería inversa, o estás pensando en dedicarte. Yo soy un auténtico novato de esta herramienta, pero lo poco que he aprendido hasta ahora quería compartirlo vosotros, y qué mejor manera que hacerlo de manera práctica con este ejemplo que estamos viendo.

¿Qué buscamos exactamente?

Después de analizar varios binarios de aplicaciones iOS de diferentes arquitecturas (ARMv7 y ARM64), he llegado a la conclusión que el volcado en hexadecimal que hay que buscar con Radare2 son los siguientes:

Hex bytes: 858021 para la arquitectura ARMv7

Después de abrir Radare2 con el binario a analizar (thin_binary), para lo que usaremos la sintaxis «r2 thin_binary«, haremos una búsqueda (seek) con el comando «s«, especificando que estamos buscando un volcado en hexadecimal, de ahí la «/x» y a continuación lo que queremos buscar (858021).

PIE hexdump in Radare2

Si estamos analizando una app de iOS de ARM64, los hex bytes a buscar serían 850020.

PIE flag in Radare2

Observad que en ambos casos, cuando encuentra el patrón buscado, es decir hace 1 hit, Radare2 automáticamente nos posiciona en el offset donde los ha encontrado (0x00000018, en el último ejemplo). Finalmente mostramos un volcado de 16 bytes con el comando «px» donde podemos ver que se muestran los hex bytes que estábamos localizando.

También podemos localizar fácilmente el offset donde encontrar estos hex bytes buscando la sección / segmento _PAGEZERO, que suele estar siempre muy cerca de estos bytes. Pero sin lugar a duda, lo más certero es utilizar el comando «s/x [hexbytes_armx]» para localizarlo y ubicarnos.

Hasta aquí esta primera parte de este artículo. En el siguiente artículo veremos qué bytes hay que modificar, cómo abrir el binario en Radare2 en modo escritura, cómo buscar diferencias enter el binario original y el parcheado con rabin2 y finalmente comprobar nuevamente con otool que hemos conseguido deshabilitar el flag de PIE.

Como siempre, espero que sea de vuestro interés y nos vemos pronto en la segunda parte de este artículo.

PD: Cualquier comentario, consulta y recomendación será bienvenido, sobre todo si es de Radare2, donde me tenéis que disculpar, pero soy muy novato. Eso sí, con muchas ganas de seguir aprendiendo y compartiendo. 🙂