Anna Antonenko, která se zabývá vývojem vestavných systémů a ve volném čase rozvíjí operační systém BOSS (BEAM-based Operating System with Security), zveřejnila výsledky reverzního inženýrství hudebního syntezátoru Yamaha PSR-E433. Během provedené práce byl v syntezátoru odhalen obfuskovaný shell interface, který umožnil provádění vlastního kódu na úrovni firmwaru. Přístup k shell interface se realizuje prostřednictvím odesílání MIDI paketů se zprávami SysEx, které lze předat při připojení syntezátoru přes USB port. Získané informace o čipu a firmwarech, stejně jako příklady kódu a ladící výpisy, byly zveřejně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 syntezátoru od prachu a zároveň uspokojit svou zvědavost spojenou s přáním podívat se na vnitřnosti zařízení. Na desce byl přítomen čip YAMAHA SWL01U, o kterém se v internetových zdrojích nepodařilo najít podrobné informace. Před několika měsíci Anna narazila na příručku k podobnému modelu syntezátoru, ve které byla uvedena pinout tohoto čipu. Anna znovu rozebrala zařízení a začala experimentovat, využívajíc dostupné vývody na desce pro ladící 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 extrahovat obsah firmware umístěného v ROM a Flash paměti. Poté byly obrazy firmware analyzovány v balíku pro reverzní inženýrství Ghidra.
Během procházení vybraných textových dat vyextrahovaných z firmwaru byl nalezen soubor řetězců ("help", "info", "ver", "logout" atd.), které připomínají příkazy programového rozhraní. Studium ukazatelů na tyto řetězce umožnilo nalézt kód, který vyvolává funkce pro zpracování příkazů, připomínající rozhraní pro přihlášení a příkazový řádek. Bylo také zjištěno, že pro aktivaci rozhraní je určena příkaz "login", do kterého je třeba zaslat 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(); // vypíše "passwd? " shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); // vypíše "login OK" shell_login_state = 2; } else { shell_print("Passwd Error\r"); shell_login_state = 0; } } else { // vlastně provést příkaz } }
Další zkoumání firmwaru ukázalo, že příkazy jsou zpracovávány v paketech, které vždy začínají stejnými 8 bajty dat a končí kódem 0xf7. Protože externí interakce se syntetizátorem probíhá pouze přes MIDI a ve specifikaci MIDI je definován speciální typ zpráv SysEx, bylo předpokládáno, že ten může být použit pro přenos příkazů. Tu myšlenku také podpořilo to, že zprávy SysEx a pakety zpracovávané rozhraním začínaly jedním kódem 0xf0, za kterým následoval identifikátor výrobce 0x43 (Yamaha).
Pro ověření hypotézy byl napsán Python skript, který převáděl zadaná data do paketů protokolu MIDI. A metoda zafungovala: 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ápovědě zobrazené při odesílání příkazu „help“ byly mimo jiné uvedeny příkazy pro změnu obsahu paměti. Pomocí těchto příkazů bylo možné načíst libovolný kód do paměti a předat mu řízení výměnou ukazatele na zásobníku, který se používá pro návrat po zpracování příkazu. Jako experiment bylo v nevyužívané oblasti paměti uloženo jednoduché aplikace napsané v assembleru, které na 8znakovém LCD displeji zobrazovalo řetězec „HeloWrld“. Program byl realizován jako běžný MIDI soubor, který stačilo přenést na zařízení.

Poté začla práce na zkoumání vlastností výstupu grafiky na LCD displej, jejímž vrcholem byla příprava kódu, který zobrazoval libovolný pixelový obsah v textové oblasti synchronně s přehráváním videa Bad Apple na externím zařízení (video s ukázkou).


Zdroj: opennet.ru
