Anna Antoněnková, která se zabývá vývojem vestavěných systémů a ve svém volném čase rozvíjí operační systém BOSS (BEAM-based Operating System with Security), publikovala výsledky reverzního inženýrství hudebního syntetizátoru Yamaha PSR-E433. Během provedené práce byl v syntetizátoru odhalen obfuskovaný shellový interface, který umožnil provádění vlastního kódu na úrovni firmwaru. Přístup k shellovému interface se realizuje prostřednictvím odesílání MIDI paketů se zprávami SysEx, které lze poslat při připojení syntetizátoru přes USB port. Získané informace o čipu a firmwaru, stejně jako příklady kódu a ladicí výpisy, jsou umístěny na GitHubu.
Zájem o reverzní inženýrství vznikl před několika lety, poté, co se Anna rozhodla vyčistit vnitřnosti syntetizátoru od prachu a zároveň uspokojit svou zvědavost spojenou s touhou podívat se na vnitřek zařízení. Na desce byl přítomný čip YAMAHA SWL01U, o kterém se na internetu nepodařilo najít podrobné informace. Před pár měsíci Anna narazila na manuál ke podobnému modelu syntetizátoru, ve kterém byla uvedena pinout tohoto čipu. Anna opět rozebrala zařízení a začala experimenty, přičemž využila dostupné vývody pro ladicí interface JTAG a port UART.

Pomocí debuggeru OpenOCD, připojení k JTAG a experimentů bylo zjištěno, že na desce je použit čip s procesorovým jádrem ARM7TDMI. Po prostudování rozložení paměti v debuggeru se podařilo vy exportovat obsah firmwaru umístěného v ROM a Flash paměti. Poté byly obrazy firmwaru analyzovány v balíku pro reverzní inženýrství Ghidra.
Pri preskúmaní vybraných reťazcových údajov z firmvéru bol zaznamenaný súbor reťazcov („help“, „info“, „ver“, „logout“ atď.), ktoré pripomínajú príkazy programového shellu. Preskúmanie ukazovateľov na tieto reťazce umožnilo nájsť kód, ktorý volá funkcie na spracovanie príkazov a pripomína prihlásenie a shell. Takisto bolo zistené, že na aktiváciu shellu je predpísaný príkaz „login“, do ktorého je potrebné zadať heslo „#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 { // vlastne spusti príkaz } }
Ďalšie preskúmanie firmvéru ukázalo, že príkazy sa spracovávajú v balíkoch, ktoré vždy začínajú rovnakými 8 bajtmi údajov a končia kódom 0xf7. Keďže vonkajšia interakcia so syntetizátorom prebieha len cez MIDI a v špecifikácii MIDI je predpísaný špeciálny typ správ SysEx, bolo predpokladané, že práve ten môže byť použitý na prenos príkazov. Teóriu podporovala aj skutočnosť, že správy SysEx a balíky spracovávané shellom začínali jedným kódom 0xf0, po ktorom nasledoval identifikátor výrobcu 0x43 (Yamaha).
Na overenie hypotézy bol napísaný Python skript, ktorý prevádzal zadané údaje na balíky protokolu MIDI. Metóda fungovala: 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 >
V nápovede, ktorá sa zobrazuje pri zaslaní príkazu «help», boli okrem iného aj príkazy na zmenu obsahu pamäte. Pomocou týchto príkazov bolo možné načítať ľubovoľný kód do pamäte a prevziať nad ním kontrolu, keď sa zmenil ukazovateľ na zásobníku používaný na návrat po dokončení spracovania príkazu. Ako experiment sa v nepoužívanej oblasti pamäte umiestnila naprogramovaná aplikácia v assembleri, ktorá vypisovala reťazec „HeloWrld“ na 8-znakový LCD displej. Program bol vytvorený vo forme obyčajného MIDI súboru, ktorý stačilo odoslať na zariadenie.

Po tomto sa začala práca na štúdiu vlastností výstupu grafiky na LCD displej, ktorého vyvrcholením bola príprava kódu, ktorý zobrazoval ľubovoľný pixelový obsah v symbolickej oblasti, súbežne s prehrávaním videa Bad Apple na externom zariadení (video s demonštráciou).


Zdroj: opennet.ru
