Anna Antonenko, zajmująca się rozwojem systemów wbudowanych oraz rozwijająca w wolnym czasie system operacyjny BOSS (BEAM-based Operating System with Security), opublikowała wyniki inżynierii odwrotnej syntezatora muzycznego Yamaha PSR-E433. W trakcie przeprowadzonej pracy w syntezatorze zidentyfikowano obfuskowany interfejs shellowy, który umożliwił wykonanie własnego kodu na poziomie oprogramowania układowego. Dostęp do interfejsu shellowego realizowany jest poprzez wysyłanie pakietów MIDI z komunikatami SysEx, które można przesyłać podczas podłączenia syntezatora przez port USB. Uzyskane w trakcie inżynierii odwrotnej informacje o chipie i wersjach oprogramowania, a także przykłady kodu i zrzuty debugowania, zostały umieszczone na GitHubie.
Zainteresowanie inżynierią odwrotną pojawiło się kilka lat temu, po tym jak Anna postanowiła oczyścić wnętrze syntezatora z kurzu i jednocześnie zaspokoić swoją ciekawość związaną z chęcią zobaczenia wnętrza urządzenia. Na płycie znajdował się chip YAMAHA SWL01U, dla którego w internecie nie udało się znaleźć szczegółowych informacji. Kilka miesięcy temu Anna natknęła się na instrukcję dotyczącą podobnego modelu syntezatora, w której podano wyprowadzenia tego chipa. Ponownie rozebrała urządzenie i rozpoczęła eksperymenty, wykorzystując znajdujące się na płycie wyprowadzenia dla interfejsu debugowania JTAG oraz portu UART.

Dzięki debuggerowi OpenOCD, podłączeniu do JTAG i eksperymentom ustalono, że na płycie znajduje się chip z rdzeniem procesora ARM7TDMI. Po zbadaniu układu pamięci w debuggerze udało się zgrać zawartość oprogramowania umieszczonego w pamięci ROM i Flash. Następnie obrazy oprogramowania zostały przeanalizowane w pakiecie do inżynierii odwrotnej Ghidra.
Podczas przeglądania wyodrębnionych z oprogramowania linijkowych danych zauważono zestaw ciągów („help”, „info”, „ver”, „logout” itp.), przypominających polecenia powłoki programowej. Analiza wskaźników do tych ciągów pozwoliła na znalezienie kodu, który wywołuje funkcje do przetwarzania poleceń, przypominających interfejs logowania i powłokę. Stwierdzono również, że do aktywacji powłoki przewidziano polecenie „login”, do którego należy przekazać hasło „#0000”. void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, „login”) == 0) { shell_ask_passwd(); // wyświetla „passwd? ” shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, „#0000”) == 0) { shell_login_ok(); // wyświetla „login OK” shell_login_state = 2; } else { shell_print(„Błąd hasła\r”); shell_login_state = 0; } } else { // właściwie uruchom polecenie } }
Dalsze badania oprogramowania wykazały, że polecenia są przetwarzane w pakietach, które zawsze zaczynają się od tych samych 8 bajtów danych i kończą kodem 0xf7. Ponieważ zewnętrzna interakcja z syntezatorem odbywa się wyłącznie przez MIDI, a w specyfikacji MIDI przewidziano specjalny typ wiadomości SysEx, założono, że to właśnie on może być używany do przesyłania poleceń. Hipoteza ta była wspierana przez to, że wiadomości SysEx i pakiety przetwarzane przez powłokę zaczynały się od kodu 0xf0, po którym następował identyfikator producenta 0x43 (Yamaha).
Aby zweryfikować hipotezę, stworzono skrypt w Pythonie, który tłumaczył wprowadzane dane na pakiety protokołu MIDI. Metoda zadziałała: 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 >
W podpowiedzi wyświetlanej po wysłaniu polecenia „help”, obok innych, znajdowały się polecenia do zmiany zawartości pamięci. Przy użyciu tych poleceń można było załadować dowolny kod do pamięci i przekazać na niego kontrolę, zmieniając wskaźnik na stosie używany do powrotu po zakończeniu przetwarzania polecenia. W ramach eksperymentu w niewykorzystanej części pamięci umieszczono napisany w asemblerze najprostszy program, który wyświetlał ciąg „HeloWrld” na 8-znakowym wskaźniku LCD. Program został zrealizowany jako zwykły plik MIDI, który wystarczyło przesłać do urządzenia.

Następnie rozpoczęto prace nad badaniem możliwości wyświetlania grafiki na wyświetlaczu LCD, kulminacją których było przygotowanie kodu, wyświetlającego dowolną zawartość pikseli w obszarze znaków, synchronicznie z odtwarzaniem wideo Bad Apple na zewnętrznym urządzeniu (wideo z demonstracją).


Źródło: opennet.ru
