Un shell oculto en el sintetizador Yamaha, que permitió ejecutar código a través de MIDI

Anna Antonenko, especializada en el desarrollo de sistemas embebidos y en su tiempo libre desarrollando el sistema operativo BOSS (BEAM-based Operating System with Security), publicó los resultados de la ingeniería inversa del sintetizador musical Yamaha PSR-E433. Durante el trabajo realizado, se identificó una interfaz de shell ofuscada en el sintetizador, lo que permitió ejecutar su propio código a nivel de firmware. El acceso a la interfaz de shell se realiza enviando paquetes MIDI con mensajes SysEx, que se pueden transmitir al conectar el sintetizador a través del puerto USB. La información obtenida durante la ingeniería inversa sobre el chip y los firmware, así como ejemplos de código y volcado de depuración, están disponibles en GitHub.

El interés por la ingeniería inversa surgió hace varios años, después de que Anna decidiera limpiar el interior del sintetizador del polvo y al mismo tiempo satisfacer su curiosidad por ver el interior del dispositivo. En la placa se encontraba el chip YAMAHA SWL01U, sobre el cual no se logró encontrar información detallada en internet. Hace un par de meses, Anna se topó con un manual de un modelo similar de sintetizador que contenía el esquema de pinout de este chip. Anna volvió a desarmar el dispositivo y comenzó experimentos, aprovechando los pines disponibles en la placa para la interfaz de depuración JTAG y el puerto UART.

Un shell oculto en el sintetizador Yamaha, que permitió ejecutar código a través de MIDI

Con la ayuda del depurador OpenOCD, la conexión a JTAG y los experimentos, se determinó que en la placa se utiliza un chip con núcleo de procesador ARM7TDMI. Al estudiar el mapeo de memoria en el depurador, se logró volcar el contenido de los firmware almacenados en la ROM y la memoria Flash. Después de eso, las imágenes de firmware fueron analizadas en el paquete de ingeniería inversa Ghidra.

Mientras revisaba los datos de cadena extraídos del firmware, se encontró un conjunto de cadenas («help», «info», «ver», «logout», etc.) que recuerdan a comandos de una interfaz de línea de comandos. El estudio de los punteros hacia estas cadenas permitió identificar un código que invoca funciones para procesar comandos, similar a una interfaz de inicio de sesión y de línea de comandos. También se descubrió que para activar la shell está el comando «login», al cual se debe pasar la contraseña «#0000». void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, «login») == 0) { shell_ask_passwd(); // imprime «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // imprime «login OK» shell_login_state = 2; } else { shell_print(«Error de contraseña\r»); shell_login_state = 0; } } else { // ejecutar el comando } }

Un estudio más detallado del firmware mostró que los comandos se procesan en paquetes que siempre comienzan con los mismos 8 bytes de datos y finalizan con el código 0xf7. Dado que la interacción externa con el sintetizador se realiza solo a través de MIDI y la especificación de MIDI incluye un tipo especial de mensaje de servicio SysEx, se supuso que podría utilizarse para transmitir comandos. Esta conjetura también se reforzaba por el hecho de que los mensajes SysEx y los paquetes que analiza la shell comenzaban con el código 0xf0, seguido del identificador del fabricante 0x43 (Yamaha).

Para verificar la hipótesis, se escribió un script en Python que traducía los datos ingresados a paquetes del protocolo MIDI. Y el método funcionó: login passwd? #0000 login OK > help logout help ? info ver stack perf-on perf-off perf-disp d dp d xxxxx d/s xxxxx m DIRECCIÓN DATOS m/b DIRECCIÓN DATOS m/w DIRECCIÓN DATOS m/l DIRECCIÓN DATOS > info NombreDesarrollo PSR-E433 NúmeroDesarrollo #3341 NúmeroDesarrollo Principal #3341 Hacer datos & hora 16 DE MAYO DE 2012 19:00:57 J/E Seleccionar Español >

En la ayuda mostrada al enviar el comando «help», entre otras cosas, había comandos para cambiar el contenido de la memoria. Con estos comandos se podía cargar código arbitrario en la memoria y transferir el control a él, reemplazando el puntero en la pila utilizado para regresar después de procesar el comando. Como experimento, se colocó en un área de memoria no utilizada una aplicación sencilla escrita en ensamblador que mostraba la cadena «HeloWrld» en un indicador de LCD de 8 caracteres. El programa se presentó como un archivo MIDI normal, que solo requería ser transferido al dispositivo.

Un shell oculto en el sintetizador Yamaha, que permitió ejecutar código a través de MIDI

Después de eso, comenzó el trabajo en el estudio de las características de la salida de gráficos en el LCD, culminando en la preparación de un código que mostraba contenido pixelado arbitrario en el área de caracteres, sincronizado con la reproducción del video Bad Apple en un dispositivo externo (video de demostración).

Un shell oculto en el sintetizador Yamaha, que permitió ejecutar código a través de MIDI
Reproducir video


Fuente: opennet.ru
Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster