Ghidra 101: Decodificación de cadenas de pila

Ghidra: Decodificación de cadenas de pila

En esta serie de blogs, me centraré en algunas características útiles de Ghidra que podrías haberte perdido. Cada publicación analizará una característica diferente y mostrará cómo lo ayuda a ahorrar tiempo y ser más efectivo en sus flujos de trabajo de ingeniería inversa. Ghidra es una herramienta increíblemente poderosa, pero gran parte de este poder proviene de saber cómo usarla de manera efectiva.

En esta publicación, discutiré cómo usar Ghidra Decompiler para identificar cadenas que se construyen en la pila en tiempo de ejecución. Esta técnica de apilar cadenas es una manera fácil para que un programador oscurezca datos de cadenas dentro de un programa mezclándolos como instrucciones de operandos opacos. Un patrón típico para construir una cadena de pila sería una serie de instrucciones MOV que transfieren valores constantes a ubicaciones adyacentes en la pila, como se muestra en estos ejemplos básicos:

cadena de pila de copias de un solo byte
Copias DWORD

Los ejemplos anteriores como se ven en el Decompiler:

descompilador-copias-de-un-byte
descompilador-DWORD-copias

Decodificación de cadenas de pila

Algunas cadenas de pila se pueden identificar o descifrar con operaciones simples en la vista del descompilador. En el caso de las copias de un solo byte, puede ser posible leer los valores de la cadena de la pila actualizando la descripción del marco de la pila de Ghidra para que los bytes opacos individuales se interpreten como elementos en una matriz de caracteres. La forma más fácil de hacer esto es volver a escribir el primer elemento de undefined a char[n] donde n es la longitud de la cadena reconstruida.

volver a escribir variable
cuadro de diálogo selector de tipo de datos

Los cambios resultantes en el Decompiler revelan claramente la cadena:

Apilar cadena en Decompiler

Vistas previas del valor DWORD

Esta es una manera fácil de evaluar ese ejemplo simple, pero no es tan trivial convertir la construcción de cadena de pila multibyte. En este caso, es posible vislumbrar los datos a través de la vista previa del tipo de datos que aparece al pasar el mouse sobre las constantes.

Vista previa de 0x72636553
Vista previa de 0x217465

Análisis con guión

Si bien estas técnicas pueden funcionar, carecen de solidez y pueden generar confusión relacionada con el endianismo o las cadenas complicadas. Afortunadamente, Ghidra incluye un script, SimpleStackString.py, para manejar estos ejemplos.

Relacionado:  Proteja su organización cultivando una cultura de concienciación sobre ciberseguridad

Para usar el guión:

  1. Coloque el cursor en la primera línea de la construcción de cadenas de pila.
  2. Abra la ventana del Administrador de secuencias de comandos y filtre por ‘pila’.
  3. Seleccione SimpleStackString.py y haga clic en el botón ‘Ejecutar script’.
  4. La salida se registra en la Consola y se agrega en Comentarios.

A continuación, se muestra un ejemplo de resultado del uso del script SimpleStackString.py en un desafío del blog de MalwareTech:

Salida de ejemplo de una cadena de pila simple

Tenga en cuenta, sin embargo, que este script es bastante limitado y fallará en algunos escenarios, como se muestra aquí al analizar el ejemplo de copia DWORD anterior:

cadena de pila simple

El programa analizado en realidad leería ‘¡Secreto!\0’, pero aparentemente el script no infirió correctamente el orden de bytes que mezclaba la cadena. El BBBB anterior en realidad eran datos adyacentes en el programa que se malinterpretaron porque se pasó por alto la terminación nula o se ignoró de otra manera.

Más desafíos

Un desarrollador evasivo puede hacer mucho para obstaculizar nuestra capacidad de reconocer y decodificar cadenas de pila a través del análisis estático. Las escrituras que construyen la cadena de la pila pueden ejecutarse en cualquier orden, intercalarse con código funcional o ofuscarse aún más con escrituras o codificaciones señuelo. En los casos en que la recuperación estática de las cadenas de la pila sea muy tediosa, puede ser más apropiado considerar técnicas de análisis dinámico, como ejecutar el código o secciones del código dentro de un depurador o emulador. Actualmente, esto no es compatible con Ghidra, pero ha sido una de las próximas funciones más anticipadas provocadas por la NSA, y una rama ‘depurador’ empujada recientemente en GitHub finalmente hace que esta función esté disponible para las primeras pruebas. Dentro de esa rama, también hay una nota en el guía del desarrollador esa emulación también se convertirá en una característica integral de la interfaz de usuario. Con el tiempo, estas funciones ciertamente podrían simplificar el proceso de recuperación de la funcionalidad ofuscada del código compilado.

Relacionado:  Qué es el Marco de Ciberseguridad del NIST: Claves y Funcionalidades

Publicaciones Similares