Yamaha 合成器中的隐藏命令 shell,允许通过 MIDI 执行代码

安娜·安东年科(Anna Antonenko)是一位嵌入式系统开发者,业余时间还参与BOSS(基于BEAM的安全操作系统)的研发工作。她近日公布了自己对雅马哈PSR-E433音乐合成器的逆向工程成果。在工程过程中,她发现合成器内部存在一个混淆的shell接口,允许在固件层面执行自定义代码。该shell接口可通过发送包含SysEx信息的MIDI数据包来访问,这些数据包可以在合成器通过USB连接时发送。逆向工程过程中获得的芯片和固件数据,以及代码示例和调试转储文件,均已上传至GitHub。

安娜对逆向工程的兴趣始于几年前,当时她决定清理一台合成器的内部结构,以满足自己对内部构造的好奇心。这块电路板上镶嵌着一颗雅马哈SWL01U芯片,但她在网上找不到任何关于这颗芯片的详细信息。几个月前,安娜偶然发现了一份类似型号合成器的说明书,其中包含了这颗芯片的引脚图。她再次拆解了这台设备,并开始进行实验,利用电路板上的JTAG调试接口和UART端口进行测试。

Yamaha 合成器中的隐藏命令 shell,允许通过 MIDI 执行代码

利用 OpenOCD 调试器、JTAG 连接以及一些实验,我们发现该电路板使用了一个基于 ARM7TDMI 处理器内核的芯片。通过在调试器中检查内存布局,我们提取了位于 ROM 和闪存中的固件内容。然后,我们使用 Ghidra 逆向工程软件包对固件镜像进行了分析。

在审查从固件中提取的字符串数据时,我们注意到一组类似于 shell 命令的字符串(例如“help”、“info”、“ver”、“logout”等)。通过研究指向这些字符串的指针,我们找到了调用处理命令函数的代码,这些函数类似于登录界面和命令 shell。我们还发现,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(); // 输出 "登录成功" shell_login_state = 2; } else { shell_print("密码错误\r"); shell_login_state = 0; } } else { // 实际执行命令 } }

对固件的进一步检查显示,命令以数据包的形式进行处理,这些数据包始终以相同的 8 字节数据开头,并以代码 0xf7 结尾。由于与合成器的外部交互仅通过 MIDI 进行,而 MIDI 规范提供了一种名为 SysEx 的特殊服务消息类型,因此推测可以使用 SysEx 来传输命令。这一推测还得到了以下事实的支持:所有 SysEx 消息和 shell 解析的数据包均以相同的代码 0xf0 开头,后跟制造商标识符 0x43(雅马哈)。

为了验证假设,我们编写了一个 Python 脚本,将输入数据转换为 MIDI 协议数据包。该方法有效:登录密码?#0000 登录成功 > 帮助 注销 帮助?信息 版本 堆栈 性能开启 性能关闭 性能显示 d dp d xxxxx d/s xxxxx m 地址数据 m/b 地址数据 m/w 地址数据 m/l 地址数据 > 信息 DevelopName PSR-E433 DevelopNumber #3341 Main DevelopNumber #3341 制作日期和时间 2012 年 5 月 16 日 19:00:57 日/东 选择 英语 >

发送“help”命令时显示的提示信息中包含修改内存内容的命令。利用这些命令,可以将任意代码加载到内存中,并通过替换命令处理后返回时使用的栈指针来实现。作为一项实验,我们将一个用汇编语言编写的简单应用程序放置在内存的未使用区域,该程序会在8字符液晶显示屏上显示字符串“HeloWrld”。该程序以标准MIDI文件的形式实现,只需将其传输到设备即可。

Yamaha 合成器中的隐藏命令 shell,允许通过 MIDI 执行代码

此后,我们开始研究在 LCD 显示器上显示图形的特性,最终编写出一段代码,该代码可以在字符区域显示任意像素内容,并与外部设备上播放的 Bad Apple 视频同步显示(视频演示)。

Yamaha 合成器中的隐藏命令 shell,允许通过 MIDI 执行代码
播放视频


来源: opennet.ru
为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster