Red de conocimiento informático - Material del sitio web - Cómo extraer código del firmware del BIOS

Cómo extraer código del firmware del BIOS

2 Mando de interrupción de gestión del sistema inverso (SMI)

Algunas personas pueden pensar que se debería utilizar un "analizador de hardware" para participar en nuestro gran plan. De hecho, esto es un malentendido. . El controlador SMI es parte del firmware del BIOS y se puede desmontar de él de manera similar al código BIOS normal. Los dos libros de Pinczakko, "BIOS Disassembly Ninjutsu Uncovered" y "Guide to Award BIOS Reverse Engineering" describen los detalles de la ingeniería inversa de Award y AMI BIOS. Los lectores interesados ​​pueden consultar aquí. Aquí, para volcar la función de manejo de SMI desde el BIOS, tenemos dos métodos para elegir.

1. Encuentre una vulnerabilidad, ingrese a SMRAM desde el modo protegido y descargue todo el contenido en SMRAM, especialmente áreas como TSEG, High SMRAM y 0xA0000-0xBFFFF. Si el BIOS no bloquea el bit D_LCK, puede volcarlo modificando el registro de configuración PCI SMRAMC como lo describen Duflot y BSDaemon. En caso de que el BIOS bloquee la SMRAM y el firmware del BIOS parezca impecable, la única opción es modificar el BIOS para que no establezca el bit D_LCK. Vuelva a actualizar el programa modificado a la ROM del BIOS para que SMRAM no se bloquee durante el inicio. Sin embargo, para hacer esto, primero debe asegurarse de que el BIOS no requiera una firma digital (firmada digitalmente) y actualmente casi ninguna placa base utiliza firmware que no sea EFIBIOS con firmas digitales.

Creo que es necesario mencionar aquí cómo configurar el bit D_LCK en el BIOS. Normalmente, BIOS tiende a utilizar el puerto 0xCF8/0xCFC para configurar los registros de configuración PCI relevantes a través del acceso de E/S legal. El BIOS primero escribe 0x8000009C en el puerto de dirección de 0xCF8 y luego escribe el valor de 0x1A en el puerto de datos de 0xCFC. El registro SMRAMC se puede configurar para bloquear SMRAM.

2. Existe otro método, que es más simple que el anterior y no requiere acceso a los datos SMRAM en tiempo de ejecución.

2.1 Descargue el firmware más reciente del sitio web del desarrollador del BIOS o utilice un programador Flash para extraer el código binario del firmware de la ROM del BIOS. La placa base ASUS P5Q a la que nos dirigimos debe descargar el archivo P5Q-ASUS-PRO-1613.ROM.

2.2 La mayoría del firmware del BIOS contiene el módulo principal del BIOS, en el que se encuentra el controlador SMI comprimido. Utilice la herramienta de extracción/descompresión proporcionada por el desarrollador para abrir el módulo principal del BIOS. Dado que ASUS BIOS se basa en AMI BIOS, utilizamos la utilidad de manipulación del módulo AMIBIOS BIOS y MMTool.exe para extraer el módulo principal. Abra el archivo .ROM descargado en MMTool, haga clic en "Single Link Arch BIOS" para extraer el módulo (ID=1Bh), luego marque la opción "En forma sin comprimir" y finalmente guarde, obtendrá el módulo BIOS principal que contiene el SMI. mango de procesamiento.

2.3 Una vez completada la extracción del módulo BIOS principal, podemos comenzar nuestro viaje de desmontaje de SMI utilizando herramientas como HIEW o IDA Pro.

Desmontaje del mango SMI

Notamos que se utiliza una matriz de estructura en ASUS/AMI BIOS para describir la función de procesamiento SMI. Cada entrada de la matriz tiene la firma "$SMIxx", donde el carácter "xx" especifica la función de procesamiento SMI específica.

La Figura 1 muestra los datos de la tabla de despacho SMI utilizados por AMIBIOS 8 basado en la placa base ASUS P5Q SE con chipset P45.

Desmontaje de la función de asignación de SMI

Hay una función de asignación de SMI especial en BIOS, la llamamos "dispatch_smi", que recorrerá todas las entradas en la tabla de asignación y llamará a handle_smi_ptr El controlador función señalada. Si ningún controlador puede responder a la señal de interrupción SMI actual, llamará a la rutina final $DEF. El siguiente código es la función BIOS Handle_SMI que desmontamos de la placa base ASUS P5Q.

Conectar la función de procesamiento SMI

Según la discusión anterior, hay muchas formas de conectar la función de procesamiento SMI. Puede agregar un nuevo identificador de procesamiento SMI o puede agregar un controlador. identificador existente para la función de procesamiento SMI. Haga un parche y agregue nuevas funciones. No hay mucha diferencia de naturaleza entre los dos métodos, por lo que haremos la introducción necesaria en ambos casos.

1. Agregue nuestra propia función de procesamiento SMI en la tabla de asignación de SMI.

Para agregar una nueva función, primero debe crear una nueva entrada en la tabla de asignación. La llamaremos "$SMIaa", como se muestra en la Figura 3.

Esta entrada contiene un puntero al controlador SMI predeterminado. Modificaremos este controlador predeterminado más adelante. O también podemos encontrar un área libre en SMRAM, colocar un fragmento de código shell y reemplazar el puntero que apunta al identificador predeterminado por el que apunta al código shell. Finalmente, tenga en cuenta que cuando se agrega una nueva función de procesamiento a la tabla de asignación, el valor de recuento del código SMI almacenado en el segmento de datos SMRAM también aumentará en 1 en consecuencia para mantener la coherencia del número de funciones de procesamiento SMI.

La función de procesamiento de "depuración" anterior solo hace una cosa, que es copiar la tabla de asignación SMI de 0x0B428:[si] a la ubicación de 0x07000:[di]. con confianza. Tu propio código SMI lo conecta. Más adelante, implementaremos un registrador de teclas y lo inyectaremos dentro de esta función de controlador. Pero antes de comenzar un nuevo capítulo, es necesario revisar las técnicas relacionadas que se pueden utilizar para llamar al programa de grabación cuando el usuario pulsa una tecla.

1. Utilice I/O APIC para dirigir la interrupción de hardware del teclado (IRQ #01) a SMI. Shawn Embleton y Sherri Sparks utilizan el controlador de interrupciones programable avanzado de E/S para dirigir la interrupción IRQ #01 del teclado a SMI y capturar eventos de pulsación de teclas en el controlador SMI.

2. Utilice el mecanismo de captura de E/S al acceder al puerto de datos del controlador del teclado.

En este artículo, utilizamos una tecnología de captura de E/S diferente a la anterior. Esta tecnología fue utilizada originalmente por BIOS para simular el teclado PS/2. En el próximo capítulo, explicaremos su principio de funcionamiento. detalle. .

3 SMM keylogger

3.1 Mecanismo de captura de E/S de hardware

Para implementar un keylogger a nivel de kernel, uno de los métodos es enganchar la descripción de la interrupción Depurar capture la función de procesamiento #DB en la tabla de símbolos (IDT), configure los registros de depuración DR0-DR3 y use el puerto de datos 0x60 para capturar los eventos de pulsación de teclas del sistema. De manera similar, también podemos usar el método de ingresar a SMI a través del puerto de E/S del teclado 60/64. Nos referimos al documento técnico de diseño de AMI BIOS "Soporte USB para AMIBIOS8", que contiene dicha descripción.

“2.5.4 Emulación de puerto 60/64 (emulación)

Esta opción puede habilitar o deshabilitar la función trap del puerto 60h/64h.

La captura de puerto 60h/64h permite que el BIOS proporcione soporte completo basado en PS/2 para teclados y ratones USB, especialmente útil en sistemas operativos Microsoft Windows NT y aquellos que admiten teclados multilingües. Esta opción también proporciona al teclado USB varias funciones de teclado PS/2, como bloqueo del teclado, configuración de contraseña y selección de código de escaneo. "

Este mecanismo lo completa el sistema de hardware, por lo que también debemos verificar la configuración de hardware específica. Afortunadamente, tanto las CPU Intel como AMD tienen mecanismos relacionados con trampas de E/S. Manual de desarrollo de AMD " "SMM I /O Trap and I/O Restart" en la Guía del desarrollador de BIOS y Kernel para procesadores AMD Athlon 64 y AMD Opteron", y "I/O" en el manual de Intel "Manual del desarrollador de software de arquitectura Intel IA-32". Se presenta este mecanismo. en detalle en la sección "Implementación del estado y REINICIO DE INSTRUCCIONES DE E/S"

El mecanismo de captura de E/S permite que las instrucciones de ENTRADA y SALIDA se utilicen dentro del controlador SMI para acceder al sistema después de caer en SMI. Cualquier puerto de E/S El propósito de este mecanismo es encender ciertos dispositivos a través del puerto de E/S. Además, también se pueden utilizar trampas de E/S. similar al mecanismo de captura de depuración mencionado anteriormente, que utiliza trampas para capturar el acceso al puerto de E/S, pero en lugar de llamar al controlador de captura de depuración del kernel del sistema operativo, genera una interrupción SMI, deja que la CPU entre en modo SMM y ejecuta. Función de procesamiento SMI de la trampa de E/S.

Cuando el procesador queda atrapado en una instrucción de E/S y entra en modo SMM, toda la información cuando la instrucción O queda atrapada se guarda en. El campo de estado de E/S (campo de estado de E/S) del área del mapa de estado de almacenamiento de SMM (mapa de estado guardado), ubicado en la ubicación de SMBASE+0x8000x7FA4, es la distribución de datos en esta área. El programa se utilizará más adelante

- IO_SMI (bit 0) está configurado, lo que indica que es un SMI de captura de E/S

- Indicador de longitud de E/S (bits [). 1:3]) indica que el acceso de E/S es de byte (001b), palabra (010b) o dword (100b).

- Indicador de tipo de E/S (bits [4:7]). ) indica el tipo de instrucción de E/S, IN imm (1001b), IN DX (0001b), etc.

- Puerto de E/S (bits [16:31]), contiene el I al que se accede actualmente /O número de puerto

Si actualmente se accede al puerto 0x60 a través de la instrucción IN DX, ancho de bytes, IO_SMI está configurado, el registrador de pulsaciones SMM primero debe detectar y actualizar el área de mapeo de estado de almacenamiento SMM. en y luego verifique si el valor del campo de estado de E/S en 0x7FA4 es 0x00600013.

mov esi, SMBASE

mov ecx, dword ptr fs:[esi + 0xFFA4]

cmp ecx, 0x00600013

jnz _not_io_smi

Lo anterior es una forma simplificada de detección. El registrador de teclas SMM también necesita detectar otros indicadores como Tipo de E/S y Longitud de E/S en el campo de estado de E/S. Debido a que nuestro propósito es grabar el teclado, solo nos preocupamos por las capturas de E/S y no nos importan las configuraciones relacionadas de Reinicio de E/S.

El reinicio de E/S y la captura de E/S constituyen un método completo de procesamiento de E/S de SMI. Cuando se ejecuta SMI en SMM, el reinicio de E/S permite que la instrucción IN o OUT se reanude desde la interrupción de SMI y continúe la ejecución.

El mecanismo de captura de E/S nos permite caer en la rutina de procesamiento SMI durante las operaciones de lectura y escritura interactivas de software y hardware en cualquier puerto de E/S. Ahora solo nos preocupamos por el puerto de datos 0x60 para implementar I. /O durante las pulsaciones de teclas del teclado. Los pasos específicos para la captura /O son los siguientes:

1. Cuando se produce un evento de pulsación de tecla, el controlador del teclado genera una interrupción de hardware y utiliza el APIC de E/S para dirigir la IRQ. 1 señal de interrupción al controlador de procesamiento SMI.

2. Después de recibir la interrupción del teclado, APIC llama al controlador de interrupciones del teclado en IDT, que es el vector de interrupción No. 0x93 para el teclado PS/2.

3. El controlador de interrupciones del teclado lee el código de escaneo de teclas del búfer del controlador del teclado a través del puerto 0x60. Normalmente, el código de escaneo se borrará y se mostrará en la pantalla.

4. En este momento, el chipset provoca una trampa de lectura en el puerto 0x60 y genera una señal para notificar la trampa de E/S SMI.

5. En el modo SMM, el controlador de procesamiento SMI del keylogger responde a las interrupciones SMI y maneja la captura de E/S SMI.

6. Al salir de SMM, el controlador de procesamiento SMI del keylogger devuelve el resultado (código de escaneo actual) al comando de lectura en el puerto 0x60, que se entrega al controlador de interrupciones del kernel para su posterior procesamiento.

El paso 6 mencionado anteriormente devuelve el código de escaneo al controlador de interrupciones del teclado del sistema operativo. La implementación es diferente bajo la trampa de E/S y el APIC de E/S. Si se utiliza APIC para activar SMI, el registrador de teclas SMI debe completar nuevamente el código de escaneo en el búfer del controlador del teclado, esperando que el sistema operativo lo lea nuevamente para su posterior procesamiento.

Se utiliza otro método para las capturas de E/S. La instrucción "IN al, 0x60" utilizada por el controlador de interrupciones del teclado del sistema operativo provocará la captura de E/S del registrador de teclas SMM. Dado que la instrucción IN genera un bucle de captura SMI infinito, nunca podrá recuperarse del SMM al. estado original y continuar con la ejecución. En este momento, el identificador SMI solo necesita guardar el resultado de lectura de la instrucción IN en el registro AL/AX/EAX y comportarse como si la instrucción IN nunca hubiera sido atrapada.

En el sistema IA32, el registro EAX está ubicado en el desplazamiento de 0x7FD0 en el área de estado de almacenamiento SMRAM, que es SMBASE +0x8000x7FD0. En IA64, es SMBASE + 0x8000x7F5C.

Por lo tanto, cuando se configura el IO_SMI anterior, el registrador de teclas SMM necesita actualizar el código de escaneo leído desde el puerto 0x60 al dominio EAX. El siguiente es el fragmento de código para actualizar el dominio EAX:

; Verifique que el puerto 0x60 tenga el bit IO_SMI de lectura establecido cuando

2. Actualice el campo EAX del área de estado de almacenamiento SMM (SMBASE + 0x8000 + 0x7FD0)

mov esi, SMBASE

mov ecx, dword ptr fs:[esi + 0xFFA4]

cmp ecx, 0x00600013

jnz _not_io_smi

mov byte ptr fs: [esi + 0xFFD0], al

3.5 Descripción del keylogger en multiprocesador

Nuestro keylogger ha actualizado el registro EAX (RAX) en el área de mapeo del estado de almacenamiento SMRAM del sistema. un sistema multiprocesador, entonces ¿qué hacer? Cuando varios procesadores lógicos ingresan al modo SMM al mismo tiempo, todos tienen su propia área de mapeo de estado de almacenamiento SMM en SMRAM. Esto se resolverá adecuadamente asignando diferentes direcciones base SMRAM (SMBASE) a cada procesador. También se conoce como "redirección SMBASE".

Por ejemplo, en un sistema de doble procesador, los dos procesadores lógicos tienen diferentes SMBASE, SMBASE0 y SMBASE0x300; el identificador de procesamiento SMI del primer procesador comenzará desde EIP = SMBASE0x8000 Ejecución, y el segundo comienza desde EIP = SMBASE0x8000x300; de manera similar, sus respectivas áreas de mapeo de estado de almacenamiento están ubicadas en (SMBASE0x8000x7F00) y (SMBASE0x8000x7F00x300) respectivamente.

No solo 0x300, el BIOS también establecerá otras compensaciones delta SMBASE para procesadores adicionales. Aunque el offset incremental es variable, su proceso de cálculo no es complicado. El desplazamiento 0x7EFC dentro del área del mapa de estado de almacenamiento de SMM contiene un ID de revisión de SMM (ID de revisión), que es el mismo valor para cada procesador. Por ejemplo, el ID de corrección de SMM puede ser 0x30100. Encuentre el ID de corrección de cada procesador en SMRAM y calcule la diferencia entre ellos para obtener el desplazamiento relativo entre SMBASE.

A continuación mostramos el código de actualización EAX del keylogger SMM en un sistema de doble procesador. Verificará secuencialmente si el campo de estado de E/S coincide con la captura de E/S de un determinado procesador y, de ser así, actualizará el valor EAX en su área de mapa de estado de almacenamiento SMM.

; Actualización EAX en sistemas de doble procesador

mov esi, SMBASE

lea ecx, dword ptr [esi + SMM_MAP_IO_STATE_INFO]

cmp ecx, IOSMI_IN_60_BYTE

jne _skip_proc0:

mov byte ptr [esi + SMM_MAP_EAX], al

_skip_proc0:

lea ecx, dword ptr [esi + SMM_MAP_IO_STATE_INFO + 0x300]

cmp ecx, IOSMI_IN_60_BYTE

jne _skip_proc1:

mov byte ptr [esi + SMM_MAP_EAX + 0x300], al

_skip_proc1:

4 Métodos de detección recomendados

4.1 Detección del mecanismo de captura de E/S

4.2 Temporización detección