Анна Антоненко, занимаваща се с разработката на вградени системи и в свободното си време развиваща операционната система BOSS (BEAM-based Operating System with Security), публикува резултатите от обратното инженерство на музикален синтезатор Yamaha PSR-E433. В хода на проведената работа в синтезатора беше открит обфускиран shell-интерфейс, който позволи да се организира изпълнението на собствен код на ниво фърмуер. Достъпът до shell-интерфейса става чрез изпращане на MIDI пакети с SysEx съобщения, които могат да бъдат предадени при свързване на синтезатора чрез USB порт. Получената информация от обратното инженерство за чипа и фърмуерите, както и примери за код и отладъчни дъмпове, са публикувани в GitHub.
Интересът към обратното инженерство възникна преди няколко години, след като Анна реши да почисти вътрешността на синтезатора от прах и заедно с това задоволи своето любопитство, свързано с желанието да види какво има в устройството. На платката присъстваше чип YAMAHA SWL01U, за който в интернет не успя да намери подробна информация. Преди няколко месеца Анна попадна на ръководство за подобен модел синтезатор, в което беше дадена схема за свързване на този чип. Анна отново разглоби устройството и започна експерименти, използвайки наличните на платката изходи за отладъчния интерфейс JTAG и UART порта.

С помощта на отладчика OpenOCD, свързването чрез JTAG и експерименти стана ясно, че на платката се използва чип с процесорно ядро ARM7TDMI. Изучавайки разпределението на паметта в отладчика, успя да извлече съдържанието на фърмуерите, разположени в ПЗУ и Flash памет. След това образите на фърмуерите бяха анализирани в пакета за обратно инженерство Ghidra.
При преглед на извлечените от фърмуера стрингови данни, беше заб注意 набор от команди («help», «info», «ver», «logout» и т.н.), които наподобяват команди от команден интерфейс. Изследването на указателите към тези стрингове разкри код, който извиква функции за обработка на команди с интерфейс, похож на вход и команден терминал. Освен това бяха установени, че за активиране на терминала се изисква команда «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(«Passwd Error\r»); shell_login_state = 0; } } else { // реално изпълнява командата } }
По-нататъшното проучване на фърмуера показа, че командите се обработват в пакети, започващи винаги с едни и същи 8 байта данни и завършващи с код 0xf7. Тъй като външната интеракция със синтезатора се извършва само чрез MIDI и в спецификацията на MIDI е предвиден специален служебен тип съобщения SysEx, бе предполагаемо, че именно той може да се използва за предаване на команди. Убедителността на предположението също се подкрепяше от факта, че съобщенията SysEx и пакетите, разбирани от терминала, започваха с един и същи код 0xf0, следван от идентификатора на производителя 0x43 (Yamaha).
За проверка на хипотезата беше написан Python скрипт, който преобразуваше входните данни в пакети с протокол MIDI. И методът сработи: 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 >
В提示, показанном при отправке команды «help», среди прочего были команды для изменения содержимого памяти. С помощью этих команд можно было загрузить произвольный код в память и передать на него управление, изменив указатель в стеке, используемый для возврата после завершения обработки команды. В качестве эксперимента в не использованной области памяти было размещено написанное на ассемблере простое приложение, которое выводит строку «HeloWrld» на 8-символьном ЖК-дисплее. Программа была оформлена в виде обычного MIDI-файла, который достаточно было передать на устройство.

Следующим этапом стало изучение особенностей вывода графики на ЖК-дисплей, кульминацией которого стало создание кода, выводящего произвольное пиксельное содержимое в символьную область, синхронно с воспроизведением видео Bad Apple на внешнем устройстве (видео с демонстрацией).


Източник: opennet.ru
