
un framework de Ghidra para la ingeniería inversa del kernelcache de iOS
Este framework es el producto final de mi experiencia en la ingeniería inversa del Kernelcache. Normalmente busco vulnerabilidades auditando manualmente el kernel y sus extensiones, y he automatizado la mayoría de las cosas que realmente quería ver en Ghidra para agilizar el proceso de reversión, lo que ha demostrado ser eficaz y ahorra mucho tiempo. El framework funciona en iOS 12/13/14/15 y en macOS 11/12 (tanto kernelcache como KEXT individual) y se ha hecho público con la intención de ayudar a las personas a comenzar a investigar sobre el kernel de iOS sin la dificultad de preparar su propio entorno. Como creo, este framework (incluyendo el conjunto de herramientas que proporciona y con algunos conocimientos básicos de IOKit) es suficiente para empezar a hackear el Kernelcache.
El framework está completamente escrito en Python y se puede extender para construir otras herramientas; proporciona algunas API básicas que se pueden usar en casi cualquier proyecto y ahorrar tiempo de leer el manual detallado. Eres bienvenido a leer las funcionalidades principales en el directorio utils/.
Ghidra es bueno cuando se trata de analizar Kernelcaches, pero como otras herramientas de RE, requiere cierto trabajo manual; ghidra_kernelcache proporciona un buen punto de entrada para corregir cosas al inicio e incluso mientras se realiza la ingeniería inversa, proporcionando así una salida del descompilador de buen aspecto.
Hay un proyecto similar realizado por @_bazad en IDAPro llamado ida_kernelcache que proporciona un buen punto de entrada para investigadores que quieran trabajar con la imagen del kernel en IDA. Mi framework se parece un poco al trabajo de Brandon y va más allá al proporcionar muchas más características para hacer que el proceso de trabajar con el kernelcache sea menos tedioso.
::externalMethod() como para ::getTargetAndMethodForIndex().Estas características se implementan como herramientas separadas que se pueden ejecutar mediante atajos de teclado o haciendo clic en sus iconos en la barra de herramientas.
Clona el repositorio:```sh git clone https://github.com/0x36/ghidra_kernelcache.git
**Nota importante**: El proyecto ha sido probado en Ghidra 10.1_PUBLIC y 10.2_DEV y no es compatible con versiones anteriores.
Ve a *`Windows → Script Manager`,* haz clic en *`script Directory` ,* luego agrega *`ghidra_kernelcache`* a la lista de rutas de directorios.
Ve a *`Windows → Script Manager`,* en el listado de *scripts*, ve a la categoría *`iOS→kernel`* y marca los plugins que se ven allí, aparecerán en la Barra de Herramientas de GHIDRA.
En el directorio [logos/](https://github.com/0x36/ghidra_kernelcache/tree/master/logos), puedes poner tus propios logos para cada herramienta.
## Simbolización de iOS kernelcache
`ghidra_kernelcache` requiere en la primera etapa [iometa](https://github.com/Siguza/iometa/) (creado por [@s1guza](https://twitter.com/s1guza)), una herramienta potente que proporciona información de clases C++ en el binario del kernel, lo bueno es que funciona como un binario independiente, por lo que la salida se puede importar a tu framework de RE favorito simplemente analizándola. Mi framework toma la salida de iometa y la analiza para simbolizar y arreglar tablas virtuales.
### Uso
Después de descomprimir el kernel, ejecuta los siguientes comandos :```sh
$ iometa -n -A /tmp/kernel A10-legacy.txt > /tmp/kernel.txt
# if you want also to symbolicate using jtool2
$ jtool2 --analyze /tmp/kernel
Cargue el kernelcache en Ghidra, NO USE IMPORTACIÓN POR LOTES , cárguelo como imagen Mach-O.
Después de que el kernelcache se haya cargado y analizado automáticamente, haga clic en el icono mostrado en la barra de herramientas o simplemente presione Meta-Shift-K, luego coloque la ruta completa de la salida de iometa que es /tmp/kernel.txt en nuestro caso.
Si desea usar símbolos de jtool2, puede usar jsymbol.py ubicado en la categoría iOS→kernel.
Ejemplos completos de la API están en ghidra_kernelcache/kc.py
→ Aquí hay algunos ejemplos de manipulación de objetos de clase:```py from utils.helpers import * from utils.class import * from utils.iometa import ParseIOMeta
ff = "/Users/mg/ghidra_ios/kernel.txt" iom = ParseIOMeta(ff) Obj = iom.getObjects() kc = kernelCache(Obj)
kc.process_all_classes()
kc.process_classes_for_bundle("com.apple.iokit.IOSurface")
kc.process_classes_for_bundle("kernel")
kc.process_class("IOGraphicsAccelerator2")
kc.clear_class_structures()
kc.update_classes_vtable()
kc.explore_pac()
Como puedes ver, puedes simbolizar completa o parcialmente el kernelcache, si se eligió la simbolización parcial, `ghidra_kernelcache` construirá automáticamente todas las dependencias de clases antes de continuar.
Si ejecutas el script contra todo el kernelcache (simbolización completa), `ghidra_kernelcache` tardará varios minutos en analizar la imagen del kernel.
Una vez terminado, Ghidra proporcionará lo siguiente :
→ Se ha añadido una nueva categoría en el Filtro de Marcadores llamada "iOS":
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image1.png" alt="image1" width="200"/>
→ Las tablas virtuales de clases IOKit se añaden al Marcador 'iOS' para una búsqueda de tabla virtual más rápida y mejor; puedes buscar una kext o una clase proporcionando letras, palabras o el bundle de la kext en la barra de búsqueda.
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image2.png" alt="image2"/>
→ Corrección de la tabla virtual: desensambla/compila código desconocido, corrige espacios de nombres, resimboliza los métodos de clase y aplica la definición de función a cada método:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image3.png" alt="image3"/>
→ Creación de espacios de nombres de clase y coloca cada método en su propio espacio de nombres correspondiente:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image4.png" alt="image4"/>
→ Creación de la estructura de clase respetando la jerarquía de clases:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image5.png" alt="image5"/>
→ Creación de tablas virtuales de clase, y cada método tiene su propia definición de método para una mejor salida de descompilación:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image6.png" alt="image6"/>