Anna Antonenko, que trabalha no desenvolvimento de sistemas embarcados e dedica seu tempo livre ao desenvolvimento do sistema operacional BOSS (BEAM-based Operating System with Security), publicou os resultados da engenharia reversa do sintetizador musical Yamaha PSR-E433. Durante o trabalho, foi identificado um shell obfuscado no sintetizador, que permitiu a execução de código próprio no nível do firmware. O acesso ao shell é feito por meio do envio de pacotes MIDI com mensagens SysEx, que podem ser transmitidas ao conectar o sintetizador via porta USB. As informações obtidas na engenharia reversa sobre o chip e os firmwares, assim como exemplos de código e dumps de depuração, estão disponíveis no GitHub.
O interesse pela engenharia reversa surgiu há alguns anos, depois que Anna decidiu limpar o interior do sintetizador da poeira e também satisfazer sua curiosidade em ver o que havia dentro do dispositivo. Na placa estava presente um chip YAMAHA SWL01U, sobre o qual não foi possível encontrar informações detalhadas na internet. Há alguns meses, Anna encontrou um guia sobre um modelo semelhante de sintetizador, que apresentava o pinout desse chip. Anna desmontou o dispositivo novamente e começou a fazer experimentos, aproveitando os pinos disponíveis na placa para a interface de depuração JTAG e a porta UART.

Com a ajuda do depurador OpenOCD, conexão ao JTAG e experimentos, foi possível descobrir que a placa utiliza um chip com núcleo de processador ARM7TDMI. Estudando a disposição da memória no depurador, foi possível extrair o conteúdo dos firmwares armazenados na memória ROM e Flash. Após isso, as imagens dos firmwares foram analisadas no pacote de engenharia reversa Ghidra.
Durante a análise das strings de dados extraídas do firmware, foi observado um conjunto de strings ("help", "info", "ver", "logout" etc.) que lembram comandos de um shell. O estudo dos ponteiros para essas strings permitiu encontrar um código que chama funções para processar comandos, semelhante a uma interface de login e shell. Também foi descoberto que, para ativar o shell, existe um comando "login" que requer a passagem da senha "#0000". void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); // imprime "passwd? " shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); // imprime "login OK" shell_login_state = 2; } else { shell_print("Passwd Error\r"); shell_login_state = 0; } } else { // realmente execute o comando } }
Um estudo mais aprofundado do firmware mostrou que os comandos são processados em pacotes, sempre começando com os mesmos 8 bytes de dados e terminando com o código 0xf7. Como a interação externa com o sintetizador ocorre apenas através de MIDI, e a especificação MIDI prevê um tipo especial de mensagens, SysEx, supôs-se que esse tipo poderia ser utilizado para a transmissão de comandos. Essa hipótese também era reforçada pelo fato de que tanto as mensagens SysEx quanto os pacotes analisados pelo shell começavam com o código 0xf0, seguido pelo identificador do fabricante 0x43 (Yamaha).
Para testar a hipótese, foi escrito um script em Python que traduziu os dados de entrada em pacotes do protocolo MIDI. E o método funcionou: 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 >
Na dica exibida ao enviar o comando «help», entre outras coisas, havia comandos para alterar o conteúdo da memória. Com esses comandos, era possível carregar código arbitrário na memória e transferir o controle para ele, alterando o ponteiro na pilha usado para retornar após a execução do comando. Como experimento, um aplicativo simples escrito em assembly foi colocado em uma área não utilizada da memória, exibindo a string «HeloWrld» em um indicador LCD de 8 caracteres. O programa foi formatado como um arquivo MIDI comum, que bastou ser enviado ao dispositivo.

Depois disso, começou o trabalho de estudo das características da apresentação gráfica no LCD, culminando na preparação de um código que exibe conteúdo gráfico pixelado na área de caracteres, sincronizado com a reprodução do vídeo Bad Apple em um dispositivo externo (vídeo de demonstração).


Fonte: opennet.ru
