Scripts pour récupérer les définitions de chaînes dans des binaires GO avec analyse du code p. Testé avec x86, x86-64, ARM et ARM64.
Ceux-ci peuvent être trouvés dans la catégorie Golang dans le gestionnaire de scripts.
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.json .GoStringFiller.javago.string.* Après l'analyse initiale, basée sur l'ordre de longueur ascendant des données de chaîne.Il existe également quelques variations spéciales du script d'analyse de chaîne dynamique:
GoDynamicStringsSingle.javaGoDynamicStrings.java , mais utilise un seul processus de décompilateur. Utilisez-le si l'analyse d'un binaire provoque les processus de décompilateur parallèle à épuiser la mémoire du système.GoDynamicStringsHigh.javaCela peut être trouvé dans la catégorie PCODE dans le gestionnaire de scripts.
PrintHighPCode.javaVoici le flux général pour l'utilisation de ces scripts pour récupérer les définitions de chaîne dans un binaire Go:
.rodata , .rdata ou __rodata . Cliquez ensuite avec le bouton droit dans la liste des codes et choisissez "Effacer les octets de code".GoKnownStrings.java pour détecter certaines chaînes standard.GoStaticStrings.java .GoFuncCallStrings.java (si la version binaire de Golang est prise en charge par les fonctionnalités de Golang intégrées de Ghidra) .GoDynamicStrings.java .GoStringFiller.java .go.string.* Au premier byte une chaîne d'octet.go.string.* , Et définissez toutes les chaînes avec des points de début et d'évaluation évidents.GoStringFiller.java , identifiez où les longueurs de chaîne changent dans les données de chaîne non définies et définissez les chaînes les plus proches de cette limite. Ensuite, réévaluez GoStringFiller.java pour remplir automatiquement les points où il peut déterminer correctement la longueur des cordes non définies restantes.En Ghidra:
Pour l'éclipse avec le plugin Ghidradev:
Construire avec Eclipse:
Construisez directement avec Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > Un problème bien connu avec les programmes de GO ingénierie est que le manque de terminateurs nuls dans les chaînes GO rend difficile les définitions de chaînes de réduction des binaires compilées. Beaucoup de valeurs de chaîne constantes d'un programme GO sont stockées ensemble dans un blob géant dans la version compilée, sans aucun caractères de terminateur intégrée dans les données de chaîne pour marquer où une chaîne se termine et une autre commence. Même un programme simple qui imprime "Hello World!" Poste plus de 1 500 chaînes en ce qui concerne le système d'exécution GO et d'autres bibliothèques standard. Cela peut provoquer des implémentations typiques de découverte de chaîne ASCII, comme celle fournie par Ghidra, pour créer des définitions de chaînes fausses positives qui représentent des dizaines de milliers de caractères.
Au lieu de chaînes terminées nulles, GO utilise une structure de chaîne qui se compose d'un pointeur et d'une valeur de longueur. Beaucoup de ces structures de chaîne sont créées sur la pile du programme lors de l'exécution, donc récupérer les emplacements de démarrage de la chaîne individuelle et les valeurs de longueur nécessite l'analyse du code machine compilé. Il existe quelques scripts existants qui effectuent cette analyse en vérifiant certains modèles d'instructions x86-64, mais ils manquent les structures créées avec des variations non perdues d'instructions qui ont finalement le même effet sur la pile, et elles sont également limitées à une ISA spécifique.
Ghostrings évite les deux problèmes en travaillant avec les opérations simplifiées et indépendantes de l'architecture produites par l'analyse du décompilateur de Ghidra.
Copyright 2022 NCC Group. Libéré sous la licence GPLV3 (voir la licence).
Auteur du projet principal: James Chambers [email protected]