Anna Antonenko, specializată în dezvoltarea sistemelor încorporate și care își dezvoltă operațiunea de sistem BOSS (BEAM-based Operating System with Security) în timpul liber, a publicat rezultatele procesului de inginerie inversă a sintetizatorului muzical Yamaha PSR-E433. În urma lucrării realizate, a fost identificat un interfață shell obfuscată în sintetizator, care a permis executarea propriului cod la nivelul firmware-ului. Accesul la interfața shell se face prin trimiterea de pachete MIDI cu mesaje SysEx, care pot fi transmise prin conectarea sintetizatorului prin portul USB. Informațiile obținute în timpul ingineriei inverse despre cip și firmware-uri, precum și exemple de cod și dumpuri de depanare au fost publicate pe GitHub.
Interesul pentru ingineria inversă a apărut cu câțiva ani în urmă, după ce Anna a decis să curețe interiorul sintetizatorului de praf și în același timp să își satisfacă curiozitatea legată de dorința de a vedea componentele dispozitivului. Pe placă se afla cipul YAMAHA SWL01U, despre care nu a reușit să găsească informații detaliate pe internet. Cu câteva luni în urmă, Anna a dat peste un manual pentru un model similar de sintetizator, în care se oferea pinout-ul acestui cip. Anna a demontat din nou dispozitivul și a început experimentele, folosing ieșirile disponibile pe placă pentru interfața de depanare JTAG și portul UART.

Folosind debugger-ul OpenOCD, conectarea la JTAG și experimentele, s-a descoperit că pe placă este utilizat un cip cu nucleu procesor ARM7TDMI. Studiind aranjamentul memoriei în debugger, s-a reușit să se extragă conținutul firmware-urilor stocate în ROM și memoria Flash. După aceea, imaginile firmware-urilor au fost analizate în pachetul pentru inginerie inversă Ghidra.
În timpul vizionării datelor de linie extrase din firmware, a fost observat un set de șiruri („help”, „info”, „ver”, „logout” etc.), care aseamănă cu comenzile unei interfețe de comandă. Studiul indicatorilor acestor șiruri a permis găsirea codului care apelează funcții pentru procesarea comenzilor, asemănător unei interfețe de autentificare și unei linii de comandă. De asemenea, s-a descoperit că pentru activarea shell-ului este prevăzută comanda „login”, în care trebuie transmisă parola „#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(„Eroare parolă\r”); shell_login_state = 0; } } else { // execută efectiv comanda } }
O studiere ulterioară a firmware-ului a arătat că comenzile sunt procesate în pachete, care încep întotdeauna cu aceleași 8 octeți de date și se termină cu codul 0xf7. Deoarece interacțiunea externă cu sintetizatorul se realizează exclusiv prin MIDI, iar în specificația MIDI este prevăzut un tip special de mesaje de serviciu SysEx, s-a presupus că acesta ar putea fi folosit pentru transmiterea comenzilor. Presupunerea a fost întărită și de faptul că mesajele SysEx și pachetele procesate de shell începeau cu un cod 0xf0, urmat de identificatorul producătorului 0x43 (Yamaha).
Pentru a verifica ipoteza, a fost scris un script Python, care traducea datele de intrare în pachete de protocol MIDI. Și metoda a funcționat: 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 MAI 16 2012 19:00:57 J/E Select Engleză >
În sugestia afișată la trimiterea comenzii „help”, printre altele, s-au regăsit comenzi pentru modificarea conținutului memoriei. Prin intermediul acestor comenzi, era posibil să se încarce cod arbitrar în memorie și să se transfere controlul asupra acestuia, înlocuind pointer-ul din stivă utilizat pentru întoarcerea după finalizarea procesării comenzii. Ca experiment, a fost plasată într-o zonă neutilizată a memoriei o aplicație simplă, scrisă în assembler, care afișa șirul „HeloWrld” pe un indicator LCD de 8 caractere. Programul a fost conceput sub forma unui fișier MIDI obișnuit, care trebuia doar să fie transmis către dispozitiv.

După aceasta, au început lucrările de studiu a caracteristicilor de afișare a graficii pe un ecran LCD, culminând cu pregătirea codului care afișa conținut pixelat arbitrar în zona de caractere, sincronizat cu redarea videoclipului Bad Apple pe un dispozitiv extern (videoclip demonstrativ).


Sursa: opennet.ro
