
Scripts Ghidra para recuperar definições de strings em binários Go
Scripts para recuperar definições de strings em binários Go com análise de P-Code. Testado com x86, x86-64, ARM e ARM64.
Estes podem ser encontrados na categoria Golang no Gerenciador de Scripts.
GoDynamicStrings.java
GoFuncCallStrings.java
GoStaticStrings.java
GoKnownStrings.java
data/known_strings.json.GoStringFiller.java
go.string.* após a análise inicial, com base na ordem crescente de comprimento dos dados de string.Existem também algumas variações especiais do script de análise de strings dinâmicas:
GoDynamicStringsSingle.java
GoDynamicStrings.java, mas usa um único processo de descompilador. Use isso se a análise de um binário fizer com que os processos paralelos do descompilador esgotem a memória do sistema.GoDynamicStringsHigh.java
Este pode ser encontrado na categoria PCode no Gerenciador de Scripts.
PrintHighPCode.java
Este é o fluxo geral para usar esses scripts e recuperar definições de strings em um binário Go:
.rodata, .rdata ou __rodata. Em seguida, clique com o botão direito na listagem de código e escolha "Clear Code Bytes".GoKnownStrings.java para detectar algumas strings padrão.GoStaticStrings.java.GoFuncCallStrings.java (se a versão do binário Golang for suportada pelos recursos integrados de Golang do Ghidra).GoDynamicStrings.java.GoStringFiller.java.
go.string.* na primeira string de um byte.No Ghidra:
Para Eclipse com o plugin GhidraDev:
Compile com o Eclipse:
Compile diretamente com o Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>
Um problema bem conhecido na engenharia reversa de programas Go é que a falta de terminadores nulos nas strings Go torna difícil a recuperação de definições de strings em binários compilados. Muitos dos valores de string constantes de um programa Go são armazenados juntos em um único blob gigante no build compilado, sem caracteres terminadores embutidos nos dados da string para marcar onde uma string termina e outra começa. Até mesmo um programa simples que apenas imprime "Hello world!" tem mais de 1.500 strings relacionadas ao sistema de runtime do Go e a outras bibliotecas padrão. Isso pode fazer com que implementações típicas de descoberta de strings ASCII, como a fornecida pelo Ghidra, criem definições de strings falso-positivas com dezenas de milhares de caracteres.
Em vez de strings terminadas em nulo, o Go usa uma estrutura de string que consiste em um ponteiro e um valor de comprimento. Muitas dessas estruturas de string são criadas na pilha do programa em tempo de execução, portanto, recuperar locais individuais de início de string e valores de comprimento exige a análise do código de máquina compilado. Existem alguns scripts existentes que realizam essa análise verificando certos padrões de instruções x86-64, mas eles perdem estruturas criadas com variações não tratadas de instruções que, em última análise, têm o mesmo efeito na pilha, e também são restritos a uma ISA específica.
O Ghostrings evita ambos os problemas ao trabalhar com as operações de P-Code simplificadas e independentes de arquitetura produzidas pela análise do descompilador do Ghidra.
Copyright 2022 NCC Group. Lançado sob a licença GPLv3 (veja LICENSE).
Autor principal do projeto: James Chambers [email protected]
go.string.* e defina quaisquer strings com pontos inicial e final óbvios.
GoStringFiller.java, identifique onde os comprimentos das strings estão mudando nos dados de string indefinidos e defina as strings mais próximas desse limite. Em seguida, execute novamente o GoStringFiller.java para preencher automaticamente os pontos onde ele possa determinar corretamente o comprimento das strings indefinidas restantes.