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

С помощью отладчика OpenOCD, подключения к JTAG и проведенных экспериментов было установлено, что на плате используется чип с процессорным ядром ARM7TDMI. Изучив раскладку памяти в отладчике, удалось извлечь содержимое прошивок, размещённых в ПЗУ и флеш-памяти. После этого образы прошивок были проанализированы с помощью пакета для обратного инжиниринга 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(); \/\/ 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 { \/\/ actually run the command } }
По-нататъшното проучване на фърмуера показа, че командите се обработват в пакети, които винаги започват с едни и същи 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», освен другото присъстваха команди за изменение на съдържанието на паметта. С помощта на тези команди можеше да се зареди произволен код в паметта и да се предаде управлението, подменяйки указателя в стека, използван за връщане след завършване на обработката на командата. В качеството на експеримент в неизползвана област на паметта беше разположено написаното на асемблер език най-простичко приложение, изведено на 8-символния ЖК-дисплей с текста «HeloWrld». Програмата беше форматирана като обикновен MIDI файл, който просто трябваше да се предаде на устройството.

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


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