Software

Cómo entrenar a tu Ghidra

Comenzar a utilizar Ghidra

Durante aproximadamente dos décadas, utilizar ingeniería inversa significaba tener que dominar la última herramienta de desensamblado, IDA pro. Con los años, se crearon muchas otras herramientas para complementarla o directamente reemplazarla, pero solo unas pocas tuvieron éxito. Luego llegó la era de la decompilación, lo que aumentó el costo e hizo que la barrera para entrar al campo de la ingeniería inversa fuera más grande.

Más adelante, en 2019, se publicó Ghidra: una herramienta completamente gratuita y de código abierto con un poderoso desensamblador y un desensamblador integrado para cada plataforma compatible. Sin embargo, la primera vez que se lanzó ni siquiera lucía parecida a lo que nosotros, los que trabajamos con ingeniería inversa, estábamos acostumbrados. Por eso, muchos la probamos y luego la abandonamos.

Puede sonar como una anécdota, pero la respuesta más popular a la pregunta “¿Has usado Ghidra?” que suelo escuchar es “Sí, la probé, pero ya me acostumbré a usar IDA” o “No tengo tiempo para investigarla, quizás más adelante”. Yo estaba en la misma situación: intentaba invertir algo, no lograba hacerlo y volvía a usar herramientas conocidas. Cada tanto descargaba una nueva versión e intentaba hacer algún trabajo o jugar Captura la bandera. Un día, luego de hacer algunas mejoras en la configuración y de agregar algunas bases de datos que faltaban, ya no volví atrás.

Por ello, esta es mi breve introducción sobre cómo configurar Ghidra y cómo hacerlo con atajos e IU conocidos, para que no tengas que volver a aprender todas las secuencias de teclas a las que te acostumbraste a lo largo de estos años.

Descargo de responsabilidad

Ghidra es una recopilación de código fuente compleja con muchas dependencias de terceros que se sabe que tienen vulnerabilidades de seguridad. No hay garantías de que la actual base de código no las tenga ni de que no contenga ninguna puerta trasera. Procede con precaución y manéjala con cuidado.

Generación de Ghidra

La manera más sencilla de conseguir Ghidra es descargar la versión actual publicada en Github. El código actual tiene meses de atraso en relación con la rama principal y probablemente no tenga todas las últimas funciones. Por ello, aunque no es el enfoque que se recomienda oficialmente, sugiero obtener el código de última tecnología desde la rama principal y generar los binarios por tu cuenta. Mientras tanto, vamos a preparar nuestra propia generación de la rama principal y a dejarla disponible para descargar.

Así que, comencemos.

Primero, necesitas seguir los requisitos previos:

Todos los sistemas operativos:

Además, necesitas el compilador específico de la plataforma específica para generar los binarios nativos:

  • Windows: Microsoft Visual Studio (de 2017 o versiones posteriores; la versión Community 2022 funciona bien)
  • Linux: versión moderna de GNU Compiler Collection (las 9 y 12 funcionan bien)
  • macOS: herramientas de generación de Xcode

Luego, descarga el código fuente más reciente en un archivo ZIP y extráelo o clona el repositorio Git oficial.

Generación en Windows

Abre el aviso de línea de comandos (CMD.EXE).

Establece el directorio que contiene el código fuente como el actual:
cd %directory_of_ghidra_source_code%
Ejecuta “bin\gradle.bat” desde el directorio Gradle para iniciar el árbol fuente y descargar todas las dependencias:
gradle.bat -I .\gradle\support\fetchDependencies.gradle init
Necesitas una conexión a Internet activa y tomará entre 5 y 10 minutos descargar todas las dependencias.

Al final, el resultado debería decir “BUILD SUCCESSFUL” e indicar con claridad que se encontró Visual Studio (se necesita para continuar con la generación).

Si hay problemas, comprueba tu conexión a Internet (siempre que tengas Visual Studio, JDK y Gradle instalados de manera correcta). Una vez que la generación se complete con éxito, emite el comando final:
gradle.bat buildGhidra
Tomará más tiempo y puede que veas muchas advertencias, pero el veredicto final debe seguir siendo “BUILD SUCCESSFUL”.

El paquete de Ghidra completo está escrito como un archivo ZIP en el directorio “build/dist”. Para ejecutar Ghidra, extrae el archivo ZIP e inicia “ghidraRun.bat”.

En el momento en que se escribió esto, Ghidra 10.3-DEV utilizaba la configuración de IU “Windows” de manera predeterminada, por lo que no había necesidad de reconfigurar la opción “look and feel”.

Generación en Linux

Usa una ventana terminal existente o abre una nueva.

Establece el directorio que contiene el código fuente como el actual:
cd %directory_of_ghidra_source_code%
Ejecuta “bin\gradle” desde el directorio Gradle para iniciar el árbol fuente y descargar todas las dependencias:
gradle -I ./gradle/support/fetchDependencies.gradle init
Necesitas una conexión a Internet activa y tomará entre 5 y 10 minutos descargar todas las dependencias. Esta tarea podría fallar si tu configuración regional no es “en_US” y GCC utiliza mensajes traducidos:

Esto podría ocurrir, por ejemplo, con el idioma ruso, ya que la secuencia de la versión para GCC se traduce:

Para mitigarlo, ejecuta gradle con el prefijo “LANG=C”:
LANG=C gradle -I ./gradle/support/fetchDependencies.gradle init
Al final, el resultado debería decir “BUILD SUCCESSFUL”.

Luego, genera Ghidra y todas las dependencias:
Gradle buildGhidra
Una vez que la generación se completa con éxito, se puede encontrar un archivo ZIP en el directorio build/dist. Extráelo de allí.

Para iniciar Ghidra, usa el script de shell “ghidraRun” en el directorio raíz del archivo extraído:

En el momento que esto se escribió, la versión 10.3-DEV utilizaba la opción de apariencia “Nimbus” por defecto:

Para utilizar apariencias más conocidas, cambia a “Native” o “GTK+”; usa el menú “Edit -> Tool Options -> Tool”, y elige el elemento que necesites de la lista desplegable “Swing Look And Feel”. Así luce el tema “Native” en Gnome 3:

Generación en macOS

Para macOS, necesitas tener las herramientas de línea de comandos de Xcode instaladas, entre ellas un sustituto para GCC y Make. Simplemente puede realizarse abriendo una ventana terminal y ejecutando GCC. Si las herramientas no están instaladas, aparecerá un diálogo de instalación. Solo confirma la instalación y espera a que se descarguen las herramientas.

Una vez que las herramientas están instaladas, el proceso de generación es idéntico al que se realiza en Linux.

Establece el directorio que contiene el código fuente como el actual:
cd %directory_of_ghidra_source_code%
Ejecuta “bin\gradle” desde el directorio Gradle para iniciar el árbol fuente y descargar todas las dependencias:
gradle -I ./gradle/support/fetchDependencies.gradle init
Luego, inicia el proceso de generación principal:
gradle buildGhidra

Descomprime el paquete Ghidra resultante desde el directorio build/dist e inicia el script de shell “ghidraRun”:

La apariencia predeterminada de macOS es nativa por defecto:

Configuración de la IU

Para configurar Ghidra, primero creemos un proyecto provisional. Un proyecto que se usa para almacenar todos los resultados del análisis, como una base de datos IDB pero para varios archivos (muestras) y carpetas, también puede tener de base de datos de tipos que se pueden compartir entre diferentes archivos. Incluso puede conectarse a una base de datos remota para realizar trabajos colaborativos, pero eso va más allá de la simple configuración.

Entonces, usemos el menú “File -> New Project…”. Escribe un nombre para el proyecto y la ubicación del archivo del sistema y continua:

Ahora tenemos un proyecto vacío. Ahora iniciemos la herramienta CodeBrowser, que es la IU principal para trabajar con binarios:

Esto abrirá una ventana de lista vacía con algunas subventanas dentro:

Este será el espacio de trabajo principal en Ghidra, así que vamos a reconfigurarlo para que se comporte y luzca como aquello a lo que estamos acostumbrados.

Barra de navegación

Es vertical y está ubicada en el lado derecho de la lista, al lado de la barra de desplazamiento. Para activarla, usa el botón “overview”:

El resto de las opciones están establecidas en la ventana “Options” al utilizar el menú “Edit -> Tool Options…“.

Fuente del editor hexadecimal

Selecciona lo siguiente en la pestaña “Options -> ByteViewer“:

Desplazamiento hexadecimal en estructuras

Establece lo siguiente en la pestaña “Options -> Structure Editor”:

¡Atajos!

Los atajos predeterminados, o “vinculaciones de teclas”, pueden ser confusos incluso para un experto en ingeniería inversa y parecen basarse en los que se usan en Eclipse. Puedes buscar los atajos que sean de tu interés y establecerlos o cambiarlos utilizando un filtro. Para que la transición sea más fácil, preparamos una configuración pregenerada con atajos conocidos (C para código, D para datos, X para referencias externas, Esc para ir hacia atrás, etc.). La puedes descargar desde aquí e importarla:

Fuente de la lista de desensamblado

Elige el color y la fuente desde la pestaña “Options -> Listing Display”:

Lista compacta de elementos de matrices:

Estos se llaman “elements per line” en la pestaña “Listing Fields -> Array Options”. Además, quizás quieras cambiar la opción de “Array Index Format” por “hex” para evitar confusiones en la lista.

Una línea por instrucción

Para lograr esto, establece el valor de “maximum lines to display” en “1” en el menú “Options -> Listing Fields -> Bytes Field”. También es buena idea tildar “Display in Upper Case”.

Resaltar con el clic izquierdo del mouse

Probablemente sea la opción más buscada y con las configuraciones predeterminadas más frustrantes. Para resaltar valores, registros, etiquetas y cualquier otra cosa con el clic izquierdo, configura la opción “Options -> Listing Fields -> Cursor Text Highlight”, “Mouse Button To Activate” en “LEFT” (la opción predeterminada es “MIDDLE”).

Encabezados y pies de página de función

Tilda las funciones “Flag Function Entry” y “Flag Function Exits” en la pestaña “Options -> Listing Fields -> Format Code”.

Además, quita el tilde de la opción “Display Function Label” en la pestaña “Options -> Listing Fields -> Labels Field” para quitar una línea innecesaria en cada encabezado de función.

Desactivar el desplazamiento horizontal

Quita el tilde de esta opción en la pestaña “Options -> Listing Fields -> Mouse”:

Mostrar nombres de registros, matrices largas y cadenas “normales”

De manera predeterminada, Ghidra muestra los nombres de las variables locales en vez de los registros. En algunos casos, esto puede ser útil, pero también puede causar frustración cuando se intenta leer un ensamblaje sin formato.

Para que Ghidra muestre los nombres de los registros sin formato, quita el tilde de la opción “Markup register variable references” en la pestaña “Options -> Listing Fields -> Operands Field”.

También puede ser útil aumentar el valor de “Maximum Lines to Display” a 200 y tildar la opción “Enable word wrapping” para que las matrices y las cadenas sean más fáciles de leer.

Aumentar el número de referencias cruzadas que se muestran

Esta opción se puede configurar desde la pestaña “Options -> Listing Fields -> XREFs Field”:

Cambiar el ancho de la dirección, los bytes y las columnas del código de operación

Ghidra usa el concepto de “campos” que se pueden mover y reformatear a través de la IU. Esta característica de la IU se puede activar con el botón llamado “Edit the Listing fields” en la ventana de lista principal.

Cuando se activa, puedes mover las columnas y cambiar su ancho. La configuración se guarda si eliges la opción “save the tool” al salir de CodeBrowser.

Abrir un archivo para analizarlo

Ahora que configuramos la IU, empecemos nuestro primer análisis. Para analizar un archivo, primero necesitas importarlo. Esto significa copiar los datos en la base de datos para poder borrar el archivo original del sistema de archivos y que el archivo importado se pueda volver a guardar en el disco.

Para importar un archivo, usa el menú “File -> Import File…” en la ventana de proyectos de Ghidra. Verás un diálogo de importación.

Para evitar cualquier confusión, el “lenguaje” en Ghidra hace referencia al nombre que se le da a la combinación del nombre del procesador, la “extremidad” de bytes y la variedad del compilador. Es posible que necesites elegirlo manualmente si el formato del archivo no se reconoce o si no hay un formato.

Una vez que el archivo se haya importado, aparecerá en la ventana del proyecto. Desde allí, puedes abrirlo en la herramienta CodeBrowser para abrir la ventana de lista principal:

Con archivos nuevos, tendrás que comenzar las tareas de análisis manual o permitir que se realice el proceso de autoanálisis para realizar todas las tareas rutinarias de identificar el código, los datos, las funciones, etc.:

La configuración por defecto de los “analizadores”, que son tareas de análisis separadas, debería ser suficiente en la mayoría de los casos:

El análisis comenzará y verás una ventana de CodeBrowser que actualiza gradualmente toda la información:

Aquí hay algunos consejos para trabajar con CodeBrowser:

  • “Symbol Tree” puede usarse para encontrar todas las funciones, las exportaciones (incluido el punto de entrada) y las importaciones. Úsalo para encontrar todos los puntos de entrada para tu análisis.
  • “Data Type Manager” contiene todos los tipos, las estructuras, los tipos typedefs, los cursores y las enumeraciones. Las bibliotecas de tipo externo están cargadas aquí, en el menú “arrow”.
  • Usa el menú “Window” para descubrir la mayoría de las funcionalidades de CodeBrowser.
  • Los segmentos de los archivos se muestran en la ventana “Memory Map”. Ábrelo con un botón o a través del menú “Window”.

Un poco más

Ghidra incluye una recopilación de scripts de ayuda en Java y Phyton que se pueden localizar con el “Script Manager”: usa el botón o ábrelo con el menú “Window”. Además, tiene una consola interactiva de Phyton 2 integrada (de hecho, Jython). Usa el menú “Window -> Python” y descubre la API simple usando “dir()”:

Algunas cosas más

Actualmente, a la generación básica de Ghidra le faltan montones de tipos de datos de Windows que son necesarios para realizar tareas de análisis típicos de malware. Preparamos una base de datos de tipo extendido para Windows y agregamos FIDB (firmas de función en tiempo de ejecución) para VS2013 y Delphi. Se pueden descargar desde aquí.

Es solo el comienzo

Esperamos que este manual te ayude a reconfigurar Ghidra para que sea una herramienta más conveniente y fácil de usar. Al tener bases de datos de firmas y tipos adicionales, podría convertirse en una herramienta de ingeniería inversa primaria lo suficientemente poderosa, así como gratuita y de código abierto. ¡Recuerda actualizarla!

Cómo entrenar a tu Ghidra

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

Informes

BlindEagle vuela alto en LATAM

Kaspersky proporciona información sobre la actividad y los TTPs del APT BlindEagle. Grupo que apunta a organizaciones e individuos en Colombia, Ecuador, Chile, Panamá y otros países de América Latina.

MosaicRegressor: acechando en las sombras de UEFI

Encontramos una imagen de firmware de la UEFI infectada con un implante malicioso, es el objeto de esta investigación. Hasta donde sabemos, este es el segundo caso conocido en que se ha detectado un firmware malicioso de la UEFI usado por un actor de amenazas.

Suscríbete a nuestros correos electrónicos semanales

Las investigaciones más recientes en tu bandeja de entrada