Shell nascosta nel sintetizzatore Yamaha, che ha permesso di eseguire codice tramite MIDI

Anna Antonenko, che si occupa dello sviluppo di sistemi embedded e nel tempo libero sta sviluppando un sistema operativo BOSS (BEAM-based Operating System with Security), ha pubblicato i risultati del reverse engineering del sintetizzatore musicale Yamaha PSR-E433. Durante il lavoro, è stata individuata un'interfaccia shell offuscata nel sintetizzatore, che ha permesso di eseguire il proprio codice a livello di firmware. L'accesso all'interfaccia shell avviene inviando pacchetti MIDI con messaggi SysEx, che possono essere trasmessi collegando il sintetizzatore tramite la porta USB. Le informazioni ottenute dal reverse engineering sul chip e sui firmware, insieme a esempi di codice e dump di debug, sono disponibili su GitHub.

L'interesse per il reverse engineering è nato alcuni anni fa, dopo che Anna ha deciso di pulire l'interno del sintetizzatore dalla polvere e ha voluto soddisfare la sua curiosità per vedere il contenuto del dispositivo. Sulla scheda era presente un chip YAMAHA SWL01U, di cui non si è riusciti a trovare informazioni dettagliate su internet. Qualche mese fa, Anna si è imbattuta in un manuale di un modello simile di sintetizzatore, in cui erano elencati i pin di questo chip. Anna ha nuovamente smontato il dispositivo e ha iniziato a sperimentare, utilizzando i pin disponibili sulla scheda per l'interfaccia di debug JTAG e il porto UART.

Shell nascosta nel sintetizzatore Yamaha, che ha permesso di eseguire codice tramite MIDI

Grazie al debugger OpenOCD, alla connessione JTAG e a vari esperimenti, è stato scoperto che sulla scheda è utilizzato un chip con core ARM7TDMI. Esaminando la mappatura della memoria nel debugger, è stato possibile estrarre il contenuto dei firmware presenti nella ROM e nella memoria Flash. Dopo di che, le immagini dei firmware sono state analizzate utilizzando il pacchetto di reverse engineering Ghidra.

Durante la visualizzazione delle stringhe di dati estratte dal firmware, è stato notato un insieme di stringhe («help», «info», «ver», «logout» ecc.) che ricordano i comandi di una shell. L'analisi dei puntatori a queste stringhe ha rivelato il codice che chiama le funzioni per gestire i comandi, somigliante a un'interfaccia di accesso e a una shell dei comandi. È stato anche scoperto che per attivare la shell è necessario utilizzare il comando «login», trasmettendo la password «#0000». void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, «login») == 0) { shell_ask_passwd(); // prints «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // prints «login OK» shell_login_state = 2; } else { shell_print(«Passwd Error\r»); shell_login_state = 0; } } else { // actually run the command } }

Un ulteriore studio del firmware ha rivelato che i comandi vengono elaborati in pacchetti, che iniziano sempre con gli stessi 8 byte di dati e terminano con il codice 0xf7. Poiché l'interazione esterna con il sintetizzatore avviene solo tramite MIDI, e nella specifica MIDI è previsto un tipo di messaggio SysEx, si è ipotizzato che questo possa essere utilizzato per inviare i comandi. Questa supposizione è stata corroborata dal fatto che i messaggi SysEx e i pacchetti elaborati dalla shell iniziavano con il codice 0xf0, seguito dall'identificatore del produttore 0x43 (Yamaha).

Per verificare l'ipotesi, è stato scritto uno script Python, che traduceva i dati in pacchetti del protocollo MIDI. E il metodo ha funzionato: 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 ADDRESS DATA m/b ADDRESS DATA m/w ADDRESS DATA m/l ADDRESS DATA > info DevelopName PSR-E433 DevelopNumber #3341 Main DevelopNumber #3341 Make data & time MAY 16 2012 19:00:57 J/E Select English >

Nell'aiuto mostrato dopo l'invio del comando «help», c'erano comandi per modificare il contenuto della memoria. Utilizzando questi comandi, era possibile caricare codice arbitrario nella memoria e trasferirne il controllo, sovrascrivendo il puntatore nello stack utilizzato per tornare dopo il completamento dell'elaborazione del comando. Come esperimento, è stato collocato in un'area di memoria non utilizzata una semplice applicazione scritta in assembly, che visualizzava la stringa «HeloWrld» su un indicatore LCD a 8 caratteri. Il programma è stato formattato come un normale file MIDI, che bastava semplicemente inviare al dispositivo.

Shell nascosta nel sintetizzatore Yamaha, che ha permesso di eseguire codice tramite MIDI

Dopo di ciò, è iniziato lo studio delle caratteristiche di output della grafica su un display LCD, culminando con la preparazione di un codice che mostrava contenuti pixel arbitrari nell'area dei caratteri, in sincronia con la riproduzione del video Bad Apple su un dispositivo esterno (video di dimostrazione).

Shell nascosta nel sintetizzatore Yamaha, che ha permesso di eseguire codice tramite MIDI
Riproduci video


Fonte: opennet.ru
Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster