
Quelques scripts pour IDA Pro afin d’aider à la rétro-ingénierie des binaires EFI
Quelques scripts IDA pour aider à la rétro-ingénierie d'exécutables EFI.
Ce paquet contient les fichiers suivants :
efiutils.py - Module IDAPython avec quelques fonctions utilitaires
efiguids.py - Une collection de GUID connus pour les protocoles EFI
efiguids_ami.py - Une collection de GUID connus pour les protocoles utilisés dans le BIOS AMI
behemoth.h - Un énorme en-tête contenant une collection de définitions de types et de structures pour EFI
structs.idc - Un script IDC contenant quelques définitions de structures (remplacé par behemoth.h)
te_image.bt - Un modèle de l'éditeur 010 pour les images binaires TE
te_loader.py - Un script de chargement IDA Pro pour les images binaires TE
C'est ma première tentative de script IDA, alors veuillez m'excuser et me faire savoir si j'ai réinventé la roue ou fait quelque chose de stupide.
Les principales fonctions utiles sont décrites ci-dessous. Consultez le code et les docstrings pour plus d'informations sur les autres fonctions.
rename_tables()Trouve le premier point d'entrée du binaire, essaie de suivre les paramètres passés à la fonction du point d'entrée et renomme les variables globales dans lesquelles les tables EFI clés sont stockées. Les opérations de renommage suivantes sont effectuées :
La variable globale où ImageHandle aboutit est renommée en gImageHandle.
La variable globale où SystemTable aboutit est renommée en gSystemTable.
La variable globale où SystemTable->BootServices aboutit est renommée en gBootServices.
La variable globale où SystemTable->RuntimeServices aboutit est renommée en gRuntimeServices.
Les instructions d'appel ne seront suivies que sur un niveau de profondeur, car la plupart des exécutables copient les références de table dans le point d'entrée ou dans une fonction appelée depuis le point d'entrée. Modifiez MAX_STACK_DEPTH si nécessaire.
update_structs()Trouve les références croisées vers les tables renommées ci-dessus et met à jour leurs noms pour qu'ils soient des décalages de structure à partir des structures appropriées. Si rename_tables() a échoué, vous devrez renommer les choses manuellement comme ci-dessus pour que cela fonctionne correctement.
Par exemple :
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
Devient :
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()Trouve les GUID dans les segments de données et les renomme. 470 GUID de protocoles ont été extraits du code source TianoCore, et les GUID propriétaires d'Apple (et d'autres fournisseurs) seront ajoutés au fur et à mesure qu'ils seront rencontrés.
go()Méthode pratique qui fait tout ce qui précède.
Chargez votre binaire EFI dans IDA Pro
Importez behemoth.h pour définir les structures de données nécessaires
Ajoutez les structures des types locaux à votre IDB
Exécutez efiutils.py pour l'ajouter au chemin de python (ou faites-le par une autre méthode)
Jetez un œil au code/docstrings, mais probablement :
import efiutils; efiutils.go()
Pour utiliser le chargeur d'images TE te_loader.py, installez-le comme n'importe quel autre chargeur. Sur OS X, cela se fait en le copiant ou en créant un lien symbolique dans le dossier des chargeurs à idaq.app/Contents/MacOS/loaders/.