
Alcuni script per IDA Pro per assistere nel reverse engineering di binari EFI
Alcuni script IDA per assistere nel reverse engineering di eseguibili EFI.
Questo pacchetto contiene i seguenti file:
efiutils.py - Modulo IDAPython con alcune funzioni di supporto
efiguids.py - Una raccolta di GUID noti per i protocolli EFI
efiguids_ami.py - Una raccolta di GUID noti per i protocolli utilizzati nel BIOS AMI
behemoth.h - Un header di grandi dimensioni contenente una raccolta di definizioni di tipi e strutture per EFI
structs.idc - Uno script IDC contenente alcune definizioni di strutture (sostituito da behemoth.h)
te_image.bt - Un template di 010 Editor per immagini binarie TE
te_loader.py - Uno script loader IDA Pro per immagini binarie TE
Questo è il mio primo tentativo di scripting IDA, quindi per favore perdonatemi e fatemi sapere se ho reinventato la ruota o fatto qualcosa di sciocco.
Le principali funzioni utili sono descritte di seguito. Consulta il codice e le docstring per maggiori informazioni sulle altre funzioni.
rename_tables()Trova il primo punto di ingresso del binario, tenta di tracciare i parametri passati alla funzione di entry point e rinomina le variabili globali in cui sono memorizzate le tabelle EFI chiave. Vengono eseguite le seguenti operazioni di rinomina:
La globale in cui finisce ImageHandle viene rinominata in gImageHandle.
La globale in cui finisce SystemTable viene rinominata in gSystemTable.
La globale in cui finisce SystemTable->BootServices viene rinominata in gBootServices.
La globale in cui finisce SystemTable->RuntimeServices viene rinominata in gRuntimeServices.
Le istruzioni di chiamata verranno seguite solo fino a un livello di profondità, poiché la maggior parte degli eseguibili copia i riferimenti alle tabelle nel punto di ingresso o in una funzione chiamata dal punto di ingresso. Modifica MAX_STACK_DEPTH se necessario.
update_structs()Trova i cross-reference alle tabelle rinominate sopra e aggiorna i loro nomi in offset di struttura dalle strutture appropriate. Se rename_tables() fallisce, dovrai rinominare le cose manualmente come sopra affinché questo funzioni correttamente.
Ad esempio:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
Diventa:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()Trova i GUID nei segmenti dati e li rinomina. 470 GUID di protocollo sono stati estratti dal sorgente TianoCore, e i GUID proprietari Apple (e di altri vendor) verranno aggiunti man mano che vengono incontrati.
go()Metodo di comodo che esegue tutto quanto sopra.
Carica il tuo binario EFI in IDA Pro
Importa behemoth.h per definire le strutture dati necessarie
Aggiungi le strutture dai tipi locali al tuo IDB
Esegui efiutils.py per aggiungerlo al path di python (oppure fallo con un altro metodo)
Dai un'occhiata al codice/docstring, ma probabilmente:
import efiutils; efiutils.go()
Per utilizzare il loader di immagini TE te_loader.py, installalo come faresti con qualsiasi altro loader. Su OS X questo si fa copiandolo o creando un symlink nella cartella loaders in idaq.app/Contents/MacOS/loaders/.