Scripts para recuperar definiciones de cadena en binarios GO con análisis de código P. Probado con x86, x86-64, brazo y brazo64.
Estos se pueden encontrar en la categoría Golang en el administrador de scripts.
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.json .GoStringFiller.javago.string.* Después del análisis inicial, basado en el orden de longitud ascendente de los datos de la cadena.También hay un par de variaciones especiales del script de análisis de cadenas dinámicas:
GoDynamicStringsSingle.javaGoDynamicStrings.java , pero utiliza un solo proceso de descompilador. Use esto si analizar un binario provoca los procesos del descompilador paralelo para la memoria del sistema de escape.GoDynamicStringsHigh.javaEsto se puede encontrar en la categoría PCODE en el Administrador de scripts.
PrintHighPCode.javaAquí está el flujo general para usar estos scripts para recuperar las definiciones de cadenas en un binario Go:
.rodata , .rdata o __rodata . Luego haga clic derecho en la lista de código y elija "Borrar bytes de código".GoKnownStrings.java para detectar algunas cadenas estándar.GoStaticStrings.java .GoFuncCallStrings.java (si la versión binaria de Golang es compatible con las características de Golang incorporadas de Ghidra) .GoDynamicStrings.java .GoStringFiller.java .go.string.* En la primera cadena de byte.go.string.* , Y defina cualquier cadena con puntos de inicio y finalización obvios.GoStringFiller.java , identifique dónde las longitudes de la cadena están cambiando en datos de cadena indefinidos y defina las cadenas más cercanas a ese límite. Luego vuelva a ejecutar GoStringFiller.java para completar automáticamente los puntos donde puede determinar correctamente la longitud de las cadenas indefinidas restantes.En Ghidra:
Para Eclipse con el complemento Ghidradev:
Construir con eclipse:
Construir directamente con Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > Un problema bien conocido con los programas de ingeniería inversa es que la falta de terminadores nulos en las cadenas GO dificulta la recuperación de las definiciones de cadena de binarios compilados. Muchos de los valores de cadena constantes de un programa GO se almacenan juntos en una mancha gigante en la compilación compilada, sin ningún caracteres de terminador integrados en los datos de cadena para marcar donde termina una cadena y comienza otra. Incluso un programa simple que solo imprime "¡Hola mundo!" Tiene más de 1,500 cadenas relacionadas con el sistema de tiempo de ejecución GO y otras bibliotecas estándar. Esto puede causar implementaciones típicas de descubrimiento de cadenas ASCII, como la proporcionada por Ghidra, para crear definiciones de cadena falsas positivas que son decenas de miles de caracteres.
En lugar de cadenas terminadas nulas, GO usa una estructura de cadena que consiste en un puntero y un valor de longitud. Muchas de estas estructuras de cadenas se crean en la pila del programa en tiempo de ejecución, por lo que recuperar las ubicaciones de inicio de cadena individual y los valores de longitud requiere analizar el código de máquina compilado. Hay algunos scripts existentes que realizan este análisis verificando ciertos patrones de instrucciones x86-64, pero pierden estructuras creadas con variaciones no controladas de instrucciones que finalmente tienen el mismo efecto en la pila, y también están restringidos a un ISA específico.
Ghostrings evita ambos problemas trabajando con las operaciones simplificadas de código P independientes de arquitectura producidas por el análisis del descompilador de Ghidra.
Copyright 2022 NCC Group. Liberado bajo la licencia GPLV3 (ver Licencia).
Autor del proyecto principal: James Chambers [email protected]