IDAPython Embedded Toolkit es un conjunto de secuencias de comandos para automatizar muchos de los pasos asociados con el análisis estático o la ingeniería inversa del firmware de los dispositivos integrados en IDA Pro .
Empezando
Para comprender cómo y por qué se creó IDAPython Embedded Toolkit, consulte las diapositivas y la grabación de DerbyCon o RECON Presentations.
IDAPython Embedded Toolkit es un conjunto de scripts IDAPython escritos para ser independientes del procesador / arquitectura y automatizar los procesos de triage, análisis y anotación asociados con la inversión de la imagen de firmware de un dispositivo incrustado. Los scripts actualmente disponibles:
TRIAGE
Cada secuencia de comandos está escrita para ser independiente del procesador / arquitectura, pero en algunas secuencias de comandos, esto requiere una expresión regular para abordar la sintaxis específica de cada arquitectura. Antes de ejecutar las secuencias de comandos, verifique que la arquitectura de la imagen de firmware que se va a analizar sea compatible con la secuencia de comandos. Consulte Estructura arquitectónica agnóstica de las secuencias de comandos. para más detalles. IDAPython Embedded Toolkit solo se vuelve más poderoso, cuantos más procesadores sean compatibles, así que envíe una solicitud de extracción a medida que agrega nuevos procesadores.
Para ejecutar un script, debe tener instalado IDA Pro 6.95. Abra la base de datos de IDA en la que desea ejecutar un script y luego seleccione Archivo> Archivo de script ... y seleccione el script para ejecutar.
Versiones
Actualmente, IDAPython Embedded Toolkit solo se ha probado en IDA Pro 6.95. Las pruebas en IDA Pro 7.0 están actualmente en proceso.
Instalación / Uso
Si completó la instalación predeterminada para IDA Pro, debe instalar IDAPython. Puede verificar buscando en su directorio IDA una carpeta / Python. Si eso está ahí, IDAPython está instalado.
De lo contrario, instale IDAPython por https://github.com/idapython/src
git clone https://github.com/maddiestone/IDAPythonEmbeddedToolkit.git
Una vez que se instala IDAPython, los scripts de IDAPython Embedded Toolkit se pueden ejecutar abriendo una base de datos IDA y seleccionando Archivo> Archivo de script ... desde el menú superior. Luego, seleccione la secuencia de comandos para ejecutar. Cada script se ejecuta individualmente seleccionándolo a través de este proceso.
Arquitectura Agnóstica Estructura de Scripts
Los scripts en IDAPython Embedded Toolkit están escritos para ser independientes de la arquitectura y del procesador. Esto se hace buscando la estructura y los procesos comunes que no dependen de la sintaxis específica de la arquitectura. Para las secuencias de comandos que requieren sintaxis específica del procesador (por ejemplo, Nombre de registro de función especial o Sintaxis de instrucción), se utilizan expresiones regulares para cada arquitectura. Para obtener más información sobre cómo escribir expresiones regulares en Python: https://docs.python.org/2/library/re.html
Gracias a la contribución de @ tmr232, cada secuencia de comandos identifica automáticamente la arquitectura en uso y selecciona el conjunto correcto de expresiones regulares utilizando la función IDAPython: processor_name = idaapi.get_inf_structure().procName
Agregar un procesador a una secuencia de comandos
Si el procesador en uso no tiene expresiones regulares definidas dentro de la secuencia de comandos, la secuencia de comandos saldrá con un error de "Tipo de procesador no admitido". Para hacer que el script funcione, simplemente necesita agregar la expresión regular requerida. Para hacer esto:
Determine la representación de cadena de IDA del procesador. En la barra inferior de la consola, escriba el siguiente comando como se muestra en la imagen siguiente: idaapi.get_inf_structure().procName El comando generará una cadena. Esa cadena es el nombre del procesador.
Agregue una instrucción elif al script con el nombre del procesador generado en el Paso 1.
Copie las asignaciones de expresiones regulares de otro procesador y personalícelas para el nuevo procesador que se agrega. La documentación de Python para expresiones regulares está aquí. Cada script que utiliza expresiones regulares específicas del procesador describe lo que la expresión regular está describiendo en el encabezado del script.
IDAPython Embedded Toolkit es un conjunto de scripts IDAPython escritos para ser independientes del procesador / arquitectura y automatizar los procesos de triage, análisis y anotación asociados con la inversión de la imagen de firmware de un dispositivo incrustado. Los scripts actualmente disponibles:
TRIAGE
- Definir código y funciones
- Definir datos
- Definir cadenas
ANÁLISIS
- Calcular los accesos de memoria de compensación indirecta
- Encontrar accesos de memoria
ANOTAR
- Identificar el uso de GPIO
- Identificar el código "muerto"
- Uso del operando de rastreo
Para ejecutar un script, debe tener instalado IDA Pro 6.95. Abra la base de datos de IDA en la que desea ejecutar un script y luego seleccione Archivo> Archivo de script ... y seleccione el script para ejecutar.
Versiones
Actualmente, IDAPython Embedded Toolkit solo se ha probado en IDA Pro 6.95. Las pruebas en IDA Pro 7.0 están actualmente en proceso.
Instalación / Uso
Si completó la instalación predeterminada para IDA Pro, debe instalar IDAPython. Puede verificar buscando en su directorio IDA una carpeta / Python. Si eso está ahí, IDAPython está instalado.
De lo contrario, instale IDAPython por https://github.com/idapython/src
git clone https://github.com/maddiestone/IDAPythonEmbeddedToolkit.git
Una vez que se instala IDAPython, los scripts de IDAPython Embedded Toolkit se pueden ejecutar abriendo una base de datos IDA y seleccionando Archivo> Archivo de script ... desde el menú superior. Luego, seleccione la secuencia de comandos para ejecutar. Cada script se ejecuta individualmente seleccionándolo a través de este proceso.
Arquitectura Agnóstica Estructura de Scripts
Los scripts en IDAPython Embedded Toolkit están escritos para ser independientes de la arquitectura y del procesador. Esto se hace buscando la estructura y los procesos comunes que no dependen de la sintaxis específica de la arquitectura. Para las secuencias de comandos que requieren sintaxis específica del procesador (por ejemplo, Nombre de registro de función especial o Sintaxis de instrucción), se utilizan expresiones regulares para cada arquitectura. Para obtener más información sobre cómo escribir expresiones regulares en Python: https://docs.python.org/2/library/re.html
Gracias a la contribución de @ tmr232, cada secuencia de comandos identifica automáticamente la arquitectura en uso y selecciona el conjunto correcto de expresiones regulares utilizando la función IDAPython: processor_name = idaapi.get_inf_structure().procName
Agregar un procesador a una secuencia de comandos
Si el procesador en uso no tiene expresiones regulares definidas dentro de la secuencia de comandos, la secuencia de comandos saldrá con un error de "Tipo de procesador no admitido". Para hacer que el script funcione, simplemente necesita agregar la expresión regular requerida. Para hacer esto:
Determine la representación de cadena de IDA del procesador. En la barra inferior de la consola, escriba el siguiente comando como se muestra en la imagen siguiente: idaapi.get_inf_structure().procName El comando generará una cadena. Esa cadena es el nombre del procesador.

Agregue una instrucción elif al script con el nombre del procesador generado en el Paso 1.
Copie las asignaciones de expresiones regulares de otro procesador y personalícelas para el nuevo procesador que se agrega. La documentación de Python para expresiones regulares está aquí. Cada script que utiliza expresiones regulares específicas del procesador describe lo que la expresión regular está describiendo en el encabezado del script.
Scripts en el IDAPython Embedded Toolkit
data_offset_calc.py - Resolver accesos de memoria de desplazamiento indirecto Resuelve las referencias a compensaciones indirectas de una variable, registro o ubicación de memoria cuyo valor es conocido. Cambia la visualización del operando en la instrucción (función OpAlt), crea referencias cruzadas de datos (add_dref) y crea un comentario de la dirección resuelta (MakeComment). El usuario necesita definir lo siguiente: offset_var_string: la representación de cadena de la variable, registro o ubicación de memoria que se reemplazará por el valor resuelto offset_var_value: El valor de la variable definida en offset_var_string reg_ex_indirect: una expresión regular de cómo el desplazamiento indirecto accede al variable reg_ex_immediate: Una expresión regular de cómo se representa el valor de compensación inmediata new_opnd_display: Una representación de cadena de cómo el valor calculado y resuelto se debe mostrar como el operando en la instrucción
define_code_functions.py - Definir có
digo y funciones Esta secuencia de comandos escanea un área de la base de datos desde la "dirección de inicio" de entrada de usuario a "dirección final" definiendo los bytes como código e intentando definir funciones desde ese código. El guión es independiente de la arquitectura al hacer que el usuario defina una expresión regular para el "prólogo de función" y el "epílogo de función" para la arquitectura que se analiza.
define_data_as_types.py - Definir un bloque como datos Define un segmento de direcciones como el tipo de datos especificado por el usuario (byte, palabra o palabra doble). La longitud del byte para cada uno de estos tipos depende de la arquitectura, pero generalmente: 1 byte = Byte 2 bytes = Palabra 4 bytes = Palabra doble Esta secuencia de comandos sin definir todos los bytes en el rango primero, lo que significa que si anteriormente tenía código o cadenas definidas en área, se sobrescribirán como datos.
make_strings.py - Definir un bloque como cadenas Este script se usa para buscar y declarar bloques de bytes "no explorados" como cadenas ASCII. El usuario inserta la dirección inicial y final de las áreas a analizar. El script luego verifica si cada byte es un valor de carácter ASCII y finaliza con un "carácter de cadena de finalización" definido. En este ejemplo, los caracteres de cadena de finalización son 0xD, 0xA y 0x00. El script solo verifica los valores "indefinidos o no explorados" en la base de datos. Por ejemplo, si una cadena se define actualmente como código, no identificará esta cadena. Esto es para proteger los valores previamente definidos. label_funcs_with_no_xrefs.py - Etiquetar todas las funciones sin referencias cruzadas / rutas de código válidas Este script identifica lo que podría ser un "código muerto". Comprueba cada función para referencias cruzadas a la función en cuestión. Si no hay ninguno, agrega el prefijo "noXrefs_" al nombre de la función. Esto es muy eficiente para arquitecturas que no llaman funciones de manera indirecta.
identify_port_use_locations.py - Find All CPU Port Usage Identifica todo el código utilizando los puertos de la CPU y registra la dirección y las instrucciones en el archivo identificado. Existe la opción de anotar cada función que accede a un puerto / pin de CPU con un prefijo que indica que está usando el puerto / pin específico.
find_mem_acceses.py - Identificar accesos a memoria Identifica los accesos a memoria usados en el código. Cuando se identifica un acceso a memoria basado en la expresión regular aportada por el usuario, este script completa tres acciones diferentes para ayudar con el análisis estático:
Se crea una referencia cruzada entre la instrucción y la dirección de memoria. Esto fallará si la dirección no existe actualmente porque el segmento no se creó.
El valor en la dirección de la memoria se recupera y se agrega como un comentario a la instrucción de referencia.
Un diccionario de todas las direcciones de memoria a las que se accede y las direcciones de las instrucciones de referencia se imprimen y guardan en un archivo.
identify_operand_locations.py - Identificar instrucciones que hacen referencia a un operando Identifica las instrucciones en el rango start_addr to end_addr que hacen referencia al operando de entrada (regex_operand). Las direcciones de todas las instrucciones donde se encuentra el operando se imprimen en la ventana de salida IDA y se guardan en un archivo.
Copyright 2017 The Johns Hopkins University Applied Physics Laboratory LLC Todos los derechos reservados.
0 Comentarios