AlphaGolang
por Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
Descrição:
AlphaGolang é uma coleção de scripts IDAPython para ajudar engenheiros reversos de malware a dominar binários Go. A ideia é dividir os scripts em etapas concretas, evitando scripts monolíticos frágeis, e imitando a metodologia que um analista poderia seguir ao lidar com um binário Go.
Os scripts são lançados sob licença GPL (homenageando o original GolangLoaderAssist de Tim Strazzere, que refatoramos e atualizamos para python3, créditos ao Tim :) ). Contribuições são bem-vindas e incentivadas!
Requisitos: IDA Pro (idealmente v7.6+) e Python3 (eca)
Os dois primeiros passos (recreate_pclntab e function_discovery_and_renaming) funcionarão no IDA v7.5-, mas os scripts posteriores exigem IDAv7.6+. Versões mais novas são o alvo ideal para scripts futuros.
Referência Original: Palestra do Mandiant Cyber Defense Summit 2021 (Vídeo Pendente)
Metodologia de Análise AlphaGolang
-
Passo 0: Regra YARA para identificar binários Go (PE/ELF/MachO)
- identify_go_binaries.yara
- Verificação simples de cabeçalho + regex para a string de ID de compilação Go.
- Provavelmente poderia melhorar o intervalo de tamanho do ID de compilação.
-
Passo 1: Recriar tabela pcln
- recreate_pclntab.py (IDA v7.5- compatible)
- Recria a seção gopclntab a partir de heurísticas
- Principalmente útil para IDA v7.5-
-
Passo 2: Descobrir funções percorrendo a tabela pcln e adicionar nomes a todas
- function_renaming.py (IDA v7.5- compatible)
- Separado do golang loader assist
- Descobre por força bruta funções ausentes com base na tabela pcln
- Corrigiu alguns problemas de limpeza de nomes de funções da transição py3
- Refatorado para adicionar melhorias para Go v1.18 com base no Panchan da Akamai! Agradecimentos a Alex (CycleOfTheAbsurd).
-
Passo 3: Expor funções geradas pelo usuário
- categorize_go_folders.py (Requires IDA v7.6+)
- Categoriza automaticamente funções em pastas
- Requer IDAv7.6 + 'mostrar pastas' habilitado na visualização de funções
- ATUALIZAÇÃO 16.05.2022: Corrigido conflito com a ordenação de pastas do IDA v7.7
- Recomenda-se reverter os metadados do Lumina antes de executar este plugin.
-
Passo 4: Corrigir referências de strings
- fix_string_cast.py
- Separado do golang loader assist
- Adicionou lógica para indefinir blobs de string existentes antes de definir nova string
- Novas verificações de sanidade tornam-no muito mais eficaz
-
- extract_types.py
- Comenta os argumentos de todas as chamadas para
newobject, makechan, etc.
- Aplica o tipo C correto a esses objetos e os renomeia
- Obtém o nome legível por humanos e o adiciona como comentário
Correções pendentes e espaço para contribuições:
- fix_string_cast.py
- Ainda precisa de refatoração + melhores heurísticas de carregamento de string
- Pode causar travamento em binários enormes.
- Faltam alguns mecanismos indiretos de carregamento de string.
- extract_types.py
- Funciona atualmente em arquivos PE e Mach-O procurando pelos nomes de seção
.rdata ou __rodata fixos.
- É necessária uma verificação/implementação adequada para tamanhos codificados em varint
Próximos passos:
- Rastrear referências de strings por funções geradas pelo usuário
- Gerar automaticamente assinaturas YARA com base em funções geradas pelo usuário
- Gerar saída de pseudocódigo hex-rays para funções geradas pelo usuário
- Definir automaticamente breakpoints para análise dinâmica de argumentos
- ???
Créditos para:
- Tim Strazzere por lançar o golang_loader_assist original
- Milan Bohacek (Avast Software s.r.o.) por sua ajuda inestimável para entender a API idatree.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT) pelo passo 5.
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (também conhecido como CycleOfTheAbsurd) da ESET por refatorar o Passo 2 para suporte ao Go v1.18.