
Alguns scripts para IDA Pro para auxiliar na engenharia reversa de binários EFI
Alguns scripts de IDA para auxiliar na engenharia reversa de executáveis EFI.
Este pacote contém os seguintes arquivos:
efiutils.py - Módulo IDAPython com algumas funções auxiliares
efiguids.py - Uma coleção de GUIDs conhecidos para protocolos EFI
efiguids_ami.py - Uma coleção de GUIDs conhecidos para protocolos usados no BIOS AMI
behemoth.h - Um cabeçalho gigante contendo uma coleção de definições de tipos e estruturas para EFI
structs.idc - Um script IDC contendo algumas definições de estruturas (substituído por behemoth.h)
te_image.bt - Um template do 010 Editor para imagens binárias TE
te_loader.py - Um script de loader do IDA Pro para imagens binárias TE
Esta é minha primeira tentativa de scripting em IDA, então por favor, perdoe-me e me avise se eu reinventei a roda/fiz algo bobo.
As principais funções úteis são descritas abaixo. Consulte o código e docstrings para mais informações sobre outras funções.
rename_tables()Encontra o primeiro ponto de entrada do binário, tenta rastrear os parâmetros que foram passados para a função de ponto de entrada e renomeia variáveis globais nas quais as principais tabelas EFI são armazenadas. As seguintes operações de renomeação são executadas:
A global onde ImageHandle termina é renomeada para gImageHandle.
A global onde SystemTable termina é renomeada para gSystemTable.
A global onde SystemTable->BootServices termina é renomeada para gBootServices.
A global onde SystemTable->RuntimeServices termina é renomeada para gRuntimeServices.
Instruções de chamada serão seguidas apenas um nível de profundidade, pois a maioria dos executáveis copia as referências de tabela no ponto de entrada ou em uma função chamada a partir do ponto de entrada. Altere MAX_STACK_DEPTH se necessário.
update_structs()Encontra referências cruzadas para as tabelas renomeadas acima e atualiza seus nomes para serem offsets de estruturas das estruturas apropriadas. Se rename_tables() falhar, você precisará renomear as coisas manualmente como acima para que isso funcione corretamente.
Por exemplo:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
Torna-se:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()Encontra GUIDs em segmentos de dados e os renomeia. 470 GUIDs de protocolos foram extraídos do código-fonte do TianoCore, e GUIDs proprietários da Apple (e de outros fornecedores) serão adicionados conforme forem encontrados.
go()Método de conveniência que faz tudo o que foi mencionado acima.
Carregue seu binário EFI no IDA Pro
Importe behemoth.h para definir as estruturas de dados necessárias
Adicione as estruturas dos tipos locais ao seu IDB
Execute efiutils.py para adicioná-lo ao caminho do python (ou faça isso por algum outro método)
Dê uma olhada no código/docstrings, mas provavelmente:
import efiutils; efiutils.go()
Para usar o loader de imagem TE te_loader.py, instale-o como faria com qualquer outro loader. No OS X, isso é feito copiando ou criando um symlink dentro da pasta de loaders em idaq.app/Contents/MacOS/loaders/.