Anna Antonenko, som arbejder med udvikling af indlejrede systemer og i sin fritid udvikler operativsystemet BOSS (BEAM-baseret Operating System with Security), har offentliggjort resultaterne af reverse engineering af musiksynthesizeren Yamaha PSR-E433. Under det udførte arbejde blev der i synthesizeren identificeret en obfuskeret shell-grænseflade, der gjorde det muligt at udføre sin egen kode på firmware-niveau. Adgang til shell-grænsefladen opnås ved at sende MIDI-pakker med SysEx-beskeder, som kan overføres, når synthesizeren er tilsluttet via USB-porten. Oplysningerne om chippen og firmwaresa samt kodeeksempler og debugging dumps, der blev indhentet under reverse engineering-processen, er tilgængelige på GitHub.
Interessen for reverse engineering opstod for flere år siden, efter at Anna besluttede at rengøre indmaden i synthesizeren for støv og samtidig tilfredsstille sin nysgerrighed, der kom fra ønsket om at se enhedens indre. På kredsløbspladen var der en chip YAMAHA SWL01U, om hvilken det ikke lykkedes at finde detaljerede oplysninger på internettet. For et par måneder siden stødte Anna på en manual til en lignende model af synthesizer, som indeholdt pinout for denne chip. Anna adskilte enheden igen og begyndte sine eksperimenter ved at udnytte de tilgængelige stifter til JTAG-debugging-grænsefladen og UART-porten.

Ved hjælp af debuggeren OpenOCD, tilslutning til JTAG og eksperimenter blev det fastslået, at der på kredsløbspladen anvendes en chip med ARM7TDMI processorarkitektur. Efter at have studeret hukommelseslayoutet i debuggeren, var det muligt at udtrække indholdet af firmwares, der var placeret i ROM og Flash-hukommelse. Bagefter blev firmwarebilledet analyseret i reverse engineering-pakken Ghidra.
Under gennemgangen af de udvalgte strenge fra firmware blev der bemærket en samling af strenge («help», «info», «ver», «logout» osv.), der mindede om kommandoer fra en kommandolinje. Undersøgelsen af pegepindene til disse strenge viste en kode, der kaldte funktioner til håndtering af kommandoer, der minder om en login-grænseflade og en kommandolinje. Det blev også konstateret, at for at aktivere shell'en kræves kommandoen «login», hvortil adgangskoden «#0000» skal indtastes. void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, «login») == 0) { shell_ask_passwd(); // printer «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // printer «login OK» shell_login_state = 2; } else { shell_print(«Passwd Error\r»); shell_login_state = 0; } } else { // kør faktisk kommandoen } }
Yderligere undersøgelse af firmware viste, at kommandoerne behandles i pakker, der altid begynder med de samme 8 byte data og slutter med koden 0xf7. Da ekstern interaktion med synthesizeren kun sker gennem MIDI, og i MIDI-specifikationen er der en særlig kontroltype af meddelelser kaldet SysEx, blev det antaget, at dette netop kunne bruges til at overføre kommandoer. Hypotesen blev også understøttet af, at SysEx-beskederne og pakkerne, der fortolkes af shell'en, begyndte med koden 0xf0, efterfulgt af producentens identifikationskode 0x43 (Yamaha).
For at teste hypotesen blev der skrevet et Python-script, der oversatte indtastede data til MIDI-protokolpakker. Metoden virkede: 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 >
I prompt, der blev vist, da kommandoen «help» blev sendt, indeholdt blandt andet kommandoer til at ændre indholdet i hukommelsen. Ved hjælp af disse kommandoer kunne man indlæse vilkårlig kode i hukommelsen og overføre kontrollen til den ved at ændre den stack-pointer, der blev brugt til at returnere efter udførelsen af kommandoen. Som et eksperiment blev et simpelt program skrevet i assembler placeret i et ubenyttet område af hukommelsen, hvilket viste teksten «HeloWrld» på en 8-tegns LCD-skærm. Programmet blev præsenteret som en almindelig MIDI-fil, som blot skulle sendes til enheden.

Derefter begyndte arbejdet med at studere egenskaberne ved grafikudgang til LCD-skærmen, som kulminerede i forberedelsen af kode, der kunne vise vilkårligt pixel-indhold i symbolområdet, synkront med afspilningen af videoen Bad Apple på en ekstern enhed (video med demonstration).


Kilde: opennet.ru
