Analizando el depurador de Ghidra

Ghidra es el potente framework de ingeniería inversa desarrollado, mantenido y utilizado actualmente por la NSA (National Security Agency).

Este framework fue dado a conocer por primera vez durante una serie de revelaciones de herramientas de la CIA (Central Intelligence Agency) llevadas a cabo por WikiLeaks y conocido como Vault 7.

El 5 de Marzo de 2019, la NSA presentaba la herramienta Ghidra en la RSA Conference de San Francisco en la que ya te habíamos comentado que tuvimos el placer de tener representación.

La herramienta Ghidra nos pareció francamente potente cuando fue presentada en la RSA Conference de 2020 y, posteriormente, cuando pudimos estudiar su código fuente más en detalle al ser finalmente publicada, de manera oficial, por la NSA, como herramienta open source.

Entonces, considerábamos muy interesantes ciertas funcionalidades únicas en Ghidra como: PCode, el haber abordado cabalmente la funcionalidad de ingeniería inversa colaborativa, la capacidad para manejar proyectos o el seguimiento de versiones de binarios, por citar algunos ejemplos. Pero, tanto nosotros como la comunidad de Ghidra, echábamos de menos una funcionalidad importantísima: la capacidad de análisis dinámico mediante depuración.

La NSA hizo saber que, en algún momento, publicaría la versión de Ghidra con Debugger. Hemos esperado aproximadamente un año para que, no una versión de release pero sí el código fuente del Debugger, fuese publicado en un estado que se podría considerar todavía alpha. El 18 de Diciembre de 2020 la NSA (National Security Agency) creaba una rama en Github con el código del Debugger que hemos mencionado, pero todavía no había integrado dicha rama ni ofrecía una versión compilada del programa. Tendríamos que esperar todavía más.

El mismo día en que apareció la rama debugger creada por la NSA, algunos empleados de Gradiant conseguíamos compilarla para Microsoft Windows 10 x86-64 tras solucionar algunos inconvenientes, como se puede apreciar en la siguiente imagen.

Por supuesto, corregimos esos problemas con las interfaces que faltaban y el módulo PDB que impedía compilar el software en su versión para Microsoft Windows 10. Como bien sabrás, hemos sido, muy probablemente, los primeros en compilar públicamente la versión de Ghidra con la tan deseada funcionalidad de Debugger para Microsoft Windows 10 x86-64.

Si quieres probar nuestra versión compilada de Ghidra, la dejamos a tu disposición aquí, así como el hash SHA 256 para que puedas comprobar la integridad de la misma: 99b1687bf8ff72aefabaf0d01bf3c34eff17fe152f0e3d7786339a060caddced

Días después de que compilásemos Ghidra para Windows 10 x86-64, el experto en Ghidra, Fortego Engineer Mike J. Bell a.k.a “The Captain” se hacía eco en Twitter de estos problemas que ya habíamos detectado y solucionado en Gradiant con la versión de Microsoft Windows. En el canal de Telegram de Ghidra también se encontraban muchos problemas y se referían a nuestra versión (https://t.me/GhidraRE/12859) para confirmar si alguien verdaderamente lo había logrado compilar.

Si quieres utilizar nuestra versión de Ghidra con Debugger, deberás habilitar el Debugger en el apartado Tools | Import Default Tools… Esto se debe a que el Debugger es una Tool como las ya conocidas: CodeBrowser (herramienta para el análisis estático de código) y VersionTracking (herramienta para el seguimiento de los cambios entre versiones de un mismo binario).

Una vez activado, el siguiente paso consiste en importar el fichero que se desee depurar mediante Debugger.

Y, obviamente, hacer click en el botón señalado a continuación para iniciar la depuración del programa.

Cabe destacar que Ghidra no tiene su propio Debugger sino que implementa conectores que hacen uso de otros debuggers existentes. En el caso de Linux, hará uso de GDB (versión 8 o superior, es lo recomendado) y en el caso Microsoft Windows 10, hará uso de WinDbg y lucirá como se puede apreciar en la siguiente imagen.

El depurador es muy completo en cuanto a funcionalidad. Muestra: Los targets (binarios que están siendo depurados), los objetos de depuración (procesos a los cuáles se puede adjuntar, conectores, sesiones de depuración activas, hilos…).

Hay que reconocer que verdaderamente ofrece toda la potencia de WinDbg e incluso permite operar mediante comandos haciendo uso del intérprete. Por supuesto, otras capacidades típicas de depuración están cubiertas, tales como: breakpoints (software y hardware), listado de los módulos, hilos, stack y los registros. También otras capacidades menos comunes como el Static Mappings (mapeado entre un rango de direcciones del listado dinámico con un rango de direcciones del listado estático) y Time (“snapshots” en la traza actual con su correspondiente timestamp).

Bien, no nos vamos a detener en cada una de estas funcionalidades. Las Docking Windows (ventanas flotantes) que se han mencionado anteriormente y que han sido añadidas por la funcionalidad de Debugger son accesibles mediante: Tools | Debugger Si tienes dudas o quieres profundizar sobre el funcionamiento de alguna de ellas, simplemente debes pulsar F1 y accederás a la sección correspondiente de la extremadamente útil y práctica ayuda de Ghidra para el componente en el que hayas puesto el foco del ratón.

Bien, comprendamos un poco mejor cómo está implementado el conector de WinDbg. Si has abierto el Debugger de Ghidra verás el siguiente agente haciendo referencia a la librería: dbgeng.dll.

La librería dbgeng.dll está ubicada en el directorio c:\windows\system32\ y, si mostramos sus funciones exportadas mediante Radare2, luce como sigue:

Como vemos, exporta una serie de funciones que permiten operar con WinDbg. Esta librería está excelentemente documentada en Microsoft  y la manera en la que Ghidra conecta con ella es mediante JNA (Java Native Access) en el fichero DbgEngNative.java del componente agent-dbgeng. En dicho fichero se carga la librería dbgeng.dll mediante JNA (línea 32), se definen las funciones ofrecidas por dicha librería para la conexión e interactuación con Windbg (líneas 34-41) y finalmente se definen las estructuras que podíamos apreciar en la documentación de Microsoft también de esta librería (líneas 43-431).

El Debugger que te hemos mostrado de Ghidra, todavía está en desarrollo y probablemente sufra: refactorizaciones (incluyendo mover código de un directorio a otro), cambios, etc. Nosotros hemos compilado el código fuente y lo hemos puesto a tu disposición para que puedas probarlo antes de que vea la luz mediante una release oficial de la NSA. Obviamente, el componente Debugger es bastante grande, incluye diversos proyectos de Eclipse que exceden el alcance de esta entrada de blog. En cualquier caso, si te has quedado con ganas de saber más, te animamos a que visites la guía para desarrolladores del Debugger de Ghidra, en ella encontrarás información sobre la arquitectura de la herramienta Debugger y cómo agregar soporte para: otros depuradores, plataformas, emuladores, etc.

¡Qué lo disfrutes!

 

 


Autor: David Álvarez Pérez, ingeniero – investigador senior en el área de Seguridad y Privacidad de Gradiant.