
Algunos scripts para IDA Pro que ayudan con la ingeniería inversa de binarios EFI
Algunos scripts de IDA para ayudar con la ingeniería inversa de ejecutables EFI.
Este paquete contiene los siguientes archivos:
efiutils.py - Módulo IDAPython con algunas funciones auxiliares
efiguids.py - Una colección de GUID conocidos para protocolos EFI
efiguids_ami.py - Una colección de GUID conocidos para protocolos utilizados en el BIOS AMI
behemoth.h - Un encabezado gigante que contiene una colección de definiciones de tipos y estructuras para EFI
structs.idc - Un script IDC que contiene algunas definiciones de estructuras (reemplazado por behemoth.h)
te_image.bt - Una plantilla del Editor 010 para imágenes binarias TE
te_loader.py - Un script de cargador de IDA Pro para imágenes binarias TE
Este es mi primer intento de scripting con IDA, así que por favor perdóname y avísame si he reinventado la rueda o he hecho algo absurdo.
Las principales funciones útiles se describen a continuación. Consulta el código y las cadenas de documentación para obtener más información sobre otras funciones.
rename_tables()Encuentra el primer punto de entrada del binario, intenta rastrear los parámetros que se pasaron a la función de punto de entrada y renombra las variables globales en las que se almacenan las tablas EFI clave. Se realizan las siguientes operaciones de renombrado:
La variable global donde termina ImageHandle se renombra a gImageHandle.
La variable global donde termina SystemTable se renombra a gSystemTable.
La variable global donde termina SystemTable->BootServices se renombra a gBootServices.
La variable global donde termina SystemTable->RuntimeServices se renombra a gRuntimeServices.
Las instrucciones de llamada solo se seguirán un nivel de profundidad, ya que la mayoría de los ejecutables copian las referencias de las tablas en el punto de entrada o en una función llamada desde el punto de entrada. Cambia MAX_STACK_DEPTH si es necesario.
update_structs()Encuentra referencias cruzadas a las tablas renombradas anteriormente y actualiza sus nombres para que sean desplazamientos de estructura de las estructuras correspondientes. Si rename_tables() falló, necesitarás renombrar las cosas manualmente como se indicó anteriormente para que esto funcione correctamente.
Por ejemplo:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
Se convierte en:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()Encuentra GUID en los segmentos de datos y los renombra. Se extrajeron 470 GUID de protocolos del código fuente de TianoCore, y se agregarán GUID propietarios de Apple (y de otros proveedores) a medida que se encuentren.
go()Método de conveniencia que realiza todo lo anterior.
Carga tu binario EFI en IDA Pro
Importa behemoth.h para definir las estructuras de datos necesarias
Agrega las estructuras de los tipos locales a tu IDB
Ejecuta efiutils.py para agregarlo a la ruta de Python (o hazlo por algún otro método)
Echa un vistazo al código/las cadenas de documentación, pero probablemente:
import efiutils; efiutils.go()
Para usar el cargador de imágenes TE te_loader.py, instálalo como lo harías con cualquier otro cargador. En OS X, esto se hace copiándolo o creando un enlace simbólico dentro de la carpeta de cargadores en idaq.app/Contents/MacOS/loaders/.