Anna Antonenko, che si occupa dello sviluppo di sistemi embedded e nel tempo libero sviluppa il 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 svolto, è stata identificata una shell obfuscated nel sintetizzatore, che ha permesso l'esecuzione di 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 attraverso il reverse engineering riguardo al chip e ai firmware, insieme a esempi di codice e dump di debug, sono stati pubblicati su GitHub.
L'interesse per il reverse engineering è nato qualche anno fa, dopo che Anna ha deciso di pulire le interiora del sintetizzatore dalla polvere e, nel contempo, soddisfare la sua curiosità di vedere l'interno del dispositivo. Sulla scheda era presente un chip YAMAHA SWL01U, riguardo al quale non è riuscita a trovare dettagliate informazioni su internet. Alcuni mesi fa, Anna si è imbattuta in un manuale di un modello simile di sintetizzatore, che forniva la disposizione dei pin di questo chip. Anna ha smontato nuovamente il dispositivo e ha iniziato esperimenti, utilizzando i pin presenti sulla scheda per l'interfaccia di debug JTAG e la porta UART.

Attraverso il debugger OpenOCD, la connessione al JTAG e vari esperimenti, è stata scoperta l'utilizzo di un chip con nucleo ARM7TDMI sulla scheda. Esaminando la mappatura della memoria nel debugger, è stato possibile scaricare il contenuto dei firmware, memorizzati nella ROM e nella memoria Flash. Dopo di che, le immagini dei firmware sono state analizzate nel pacchetto di reverse engineering Ghidra.
Durante l'analisi dei dati estratti dal firmware, è stata notata una serie di stringhe («help», «info», «ver», «logout» e simili), che assomigliano a comandi di una shell. L'esame dei puntatori a queste stringhe ha permesso di trovare il codice che richiama funzioni per elaborare i comandi, simile a un'interfaccia di accesso e a una shell. È stato anche scoperto che esiste un comando «login» per attivare la shell, a cui è necessario passare 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(); // stampa «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // stampa «login OK» shell_login_state = 2; } else { shell_print(«Passwd Error\r»); shell_login_state = 0; } } else { // esegui effettivamente il comando } }
Un'ulteriore analisi 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 particolare tipo di messaggi di servizio SysEx, è stata avanzata l'ipotesi che esso possa essere utilizzato per trasmettere comandi. La supposizione è stata rafforzata dal fatto che i messaggi SysEx e i pacchetti analizzati dalla shell iniziavano entrambi con il codice 0xf0, seguito dall'identificatore del produttore 0x43 (Yamaha).
Per verificare l'ipotesi, è stato scritto uno script Python che traduceva i dati inseriti 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 >
Nel suggerimento mostrato durante l'invio del comando «help», tra le altre cose, erano presenti comandi per modificare il contenuto della memoria. Grazie a questi comandi era possibile caricare codice arbitrario in memoria e trasferire il controllo su di esso, modificando il puntatore nello stack utilizzato per ritornare dopo aver elaborato il comando. Come esperimento è stata posizionata in un'area di memoria non utilizzata una semplice applicazione scritta in assembler, che visualizzava la stringa «HeloWrld» su un indicatore LCD a 8 caratteri. Il programma era formato come un normale file MIDI, che era sufficiente trasferire al dispositivo.

Dopo ciò, sono iniziati i lavori per studiare le peculiarità dell'output grafico su un display LCD, culminando nella preparazione di un codice che mostrava contenuti pixel arbitrary nell'area dei caratteri, sincronizzato con la riproduzione del video Bad Apple su un dispositivo esterno (video dimostrativo).


Fonte: opennet.ru
