Скрита командна обвивка в синтезатора на Yamaha, която позволява изпълнение на код чрез MIDI

Анна Антоненко, която разработва вградени системи и в свободното си време разработва операционната система BOSS (BEAM-базирана операционна система със сигурност), публикува резултатите от обратното инженерство на музикалния синтезатор Yamaha PSR-E433. По време на извършената работа в синтезатора беше идентифициран обфусциран интерфейс на обвивката, което направи възможно организирането на изпълнението на неговия код на ниво фърмуер. Достъпът до интерфейса на обвивката се осъществява чрез изпращане на MIDI пакети, съдържащи SysEx съобщения, които могат да бъдат предадени, когато синтезаторът е свързан чрез USB. Информацията за чипа и фърмуера, получени по време на обратното инженерство, както и примери за кодове и дебъгвания, са публикувани в GitHub.

Интересът към обратното инженерство възниква преди няколко години, след като Анна решава да почисти вътрешността на синтезатора от прах и в същото време да задоволи любопитството си, свързано с желанието да види вътрешността на устройството. Платката съдържаше чип YAMAHA SWL01U, за който не можеше да се намери подробна информация в интернет. Преди няколко месеца Анна се натъкна на ръководство за подобен модел синтезатор, което съдържаше разводката на този чип. Анна отново разглоби устройството и започна експерименти, използвайки щифтовете, налични на платката за JTAG интерфейса за отстраняване на грешки и UART порта.

Скрита командна обвивка в синтезатора на Yamaha, която позволява изпълнение на код чрез MIDI

Използвайки дебъгера OpenOCD, свързвайки се с JTAG и експериментирайки, беше установено, че платката използва чип с процесорно ядро ​​ARM7TDMI. След като проучихме разположението на паметта в дебъгера, успяхме да разтоварим съдържанието на фърмуера, разположен в ROM и Flash памет. След това изображенията на фърмуера бяха анализирани с помощта на пакета за обратно инженерство Ghidra.

Докато преглеждате низовите данни, извлечени от фърмуера, бяха забелязани набор от редове („помощ“, „информация“, „вер“, „изход“ и т.н.), които наподобяват команди на shell. Изследването на указателите към тези редове разкри код, който извиква функции за обработка на команди, напомняйки интерфейс за влизане и командна обвивка. Също така беше разкрито, че за активиране на обвивката е предоставена командата „login“, на която трябва да подадете паролата „#0000“. void shell_run_command(char* command_input) { if (shell_login_state == 0) {if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); // отпечатва "passwd? " shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); // отпечатва "login OK" shell_login_state = 2; } else { shell_print("Грешка в парола\r"); shell_login_state = 0; } } else { // всъщност изпълнява командата } }

По-нататъшното изследване на фърмуера показа, че командите се обработват на партиди, като винаги започват с едни и същи 8 байта данни и завършват с код 0xf7. Тъй като външното взаимодействие със синтезатора се осъществява само чрез MIDI, а спецификацията на MIDI предоставя специален тип услуга от SysEx съобщения, се предполага, че това може да се използва за предаване на команди. Допълнително укрепване на предположението беше, че съобщенията и пакетите на SysEx, анализирани от обвивката, започваха с един код, 0xf0, последван от идентификатора на производителя 0x43 (Yamaha).

За да се тества хипотезата, беше написан скрипт на Python, който преведе входните данни в пакети на MIDI протокол. И методът проработи: login passwd? #0000 влизане OK > помощ излизане помощ? 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 > информация DevelopName PSR-E433 DevelopNumber #3341 Main DevelopNumber # 3341 Направете данни и време 16 МАЙ 2012 19:00:57 J/E Изберете английски >

Подканата, показана при изпращане на командата "помощ", включва, наред с други неща, команди за промяна на съдържанието на паметта. С помощта на тези команди беше възможно да се зареди произволен код в паметта и да се прехвърли управлението към нея, като се замени указателят в стека, използван за връщане след завършване на обработката на командата. Като експеримент, просто приложение, написано на асемблер, беше поставено в неизползвана област на паметта, която извежда низа „HeloWrld“ на 8-знаков LCD индикатор. Програмата беше форматирана като обикновен MIDI файл, който просто трябваше да бъде прехвърлен на устройството.

Скрита командна обвивка в синтезатора на Yamaha, която позволява изпълнение на код чрез MIDI

След това започна работа по изучаване на характеристиките на графичния изход на LCD дисплей, което завърши с подготовката на код, който извежда произволно пикселно съдържание в областта на знаците, синхронно с възпроизвеждането на Bad Apple видео на външно устройство (видео с демонстрация ).

Скрита командна обвивка в синтезатора на Yamaha, която позволява изпълнение на код чрез MIDI
Възпроизвеждане на видео


Източник: opennet.ru
Купете надежден хостинг за сайтове с DDoS защита, VPS VDS сървъри 🔥 Купете надежден уеб хостинг със защита от DDoS атаки, VPS VDS сървъри | ProHoster