Scripts para recuperar definições de string em binários GO com análise de código P. Testado com x86, x86-64, braço e braço64.
Eles podem ser encontrados na categoria Golang no gerente de scripts.
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.json .GoStringFiller.javago.string.* Após a análise inicial, com base na ordem de comprimento ascendente dos dados da string.Existem também algumas variações especiais do script de análise dinâmica de string:
GoDynamicStringsSingle.javaGoDynamicStrings.java , mas usa um único processo de decompilador. Use isso se a análise de um binário fizer com que os processos do decompilador paralelo na memória do sistema de escape.GoDynamicStringsHigh.javaIsso pode ser encontrado na categoria PCODE no gerenciador de scripts.
PrintHighPCode.javaAqui está o fluxo geral para o uso desses scripts para recuperar definições de string em um binário Go:
.rodata , .rdata ou __rodata . Em seguida, clique com o botão direito do mouse na lista de código e escolha "Clear Code Bytes".GoKnownStrings.java para detectar algumas seqüências padrão.GoStaticStrings.java .GoFuncCallStrings.java (se a versão binária de Golang for suportada pelos recursos de Golang de Ghidra) .GoDynamicStrings.java .GoStringFiller.java .go.string.* Na primeira string de byte.go.string.*GoStringFiller.java , identifique onde os comprimentos da string estão mudando nos dados indefinidos da string e defina as cordas mais próximas a esse limite. Em seguida, reencontre GoStringFiller.java para preencher automaticamente os pontos, onde pode determinar corretamente o comprimento das seqüências indefinidas restantes.Em Ghidra:
Para eclipse com plugin ghidradev:
Construa com Eclipse:
Construa diretamente com Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > Um problema bem conhecido com os programas de engenharia reversa é que a falta de terminadores nulos em Strings Go dificulta a recuperação das definições de string de binários compilados. Muitos dos valores de string constantes de um programa GO são armazenados juntos em uma bolha gigante na compilação compilada, sem que nenhum caractere terminador incorporado nos dados da string para marcar onde uma string termina e outra começa. Até um programa simples que apenas imprime "Hello World!" Possui mais de 1.500 strings relacionadas ao sistema de tempo de execução Go e a outras bibliotecas padrão. Isso pode causar implementações típicas de descoberta de cordas ASCII, como a fornecida por Ghidra, para criar definições de strings positivas falsas positivas que são dezenas de milhares de caracteres de comprimento.
Em vez de strings terminados null, o GO usa uma estrutura de string que consiste em um valor de ponteiro e comprimento. Muitas dessas estruturas de string são criadas na pilha do programa em tempo de execução; portanto, a recuperação de localizações individuais de string e valores de comprimento requer analisar o código da máquina compilado. Existem alguns scripts existentes que executam essa análise verificando certos padrões de instruções x86-64, mas perdem estruturas criadas com variações não tratadas de instruções que acabam tendo o mesmo efeito na pilha e também são restritas a um ISA específico.
Os Ghostrings evitam esses dois problemas trabalhando com as operações simplificadas de código P independentes da arquitetura produzidas pela análise do decompilador de Ghidra.
Copyright 2022 NCC Group. Liberado sob a licença GPLV3 (consulte a licença).
Autor do projeto principal: James Chambers [email protected]