racerxdl/stm32f0-pico-dump

GitHub: racerxdl/stm32f0-pico-dump

基于树莓派 Pico 的 STM32F0x 受保护固件提取工具,利用 SWD 竞态条件绕过 Level 1 读取保护。

Stars: 182 | Forks: 29

# 基于 Pi Pico 的 STM32F0x 受保护固件读取器 这是一个概念验证(proof of concept)的受保护固件提取器,利用了 SWD 读取过程中的总线竞态条件(bus race-condition)。为了利用这一点,你需要避免与 MCU 进行“过多对话”(像 SWD Probes 那样),而是直接切入正题。这样就可以在保护机制触发之前从固件中提取单个 32 位 DWORD。该概念验证需要控制目标设备的复位和电源,因为 SWD 上的读取保护需要通过断电重启才能复位。 互联网上有几个关于这种调试模式漏洞利用的概念验证,但大多数使用带有 MBED SDK 的 STM32,这使得编译需要大量的依赖。我喜欢简单的东西,所以我选择了 platform.io,它会为你搞定一切。我还将其移植到了 Raspberry Pi Pico (RP2040) 上,这在如今更容易获得。 这**仅**适用于 Level 1 读取保护,因为它需要 SWD 处于活动状态,而 Level 2 读取保护会完全阻止它。它可能适用于其他 STM32 变体,但尚未经过测试(如果你测试了 STM32F0x 以外的不同系列,请告诉我!) # 构建说明 构建它需要安装 platform.io: ``` pip install platformio ``` 或者访问 https://platformio.org/ 查看针对不同平台的具体说明。 要构建,只需运行: ``` pio run ``` 固件将位于 `.pio/pico/firmware.uf2`。 你也可以使用 platform.io vscode 插件,它允许你在 GUI 环境中完成所有操作。 # 用法 引脚分配默认定义在 [include/main.h](include/main.h) 中,如下所示: ``` #define TARGET_RESET_Pin 27 #define TARGET_PWR_Pin 26 #define SWDIO_Pin 14 #define SWCLK_Pin 15 ``` Pico 应该能够通过 `TARGET_PWR_Pin` 完全关闭设备。如果你的目标板只是 STM32 或者上面的元件很少,你可以直接使用 `TARGET_PWR_Pin` 作为电路板的 3.3V 电源。请记住,Pico 的电流吸入能力非常低,但对于攻击来说应该足够了。如果你不确定,可以使用继电器/mosfet 来开启/关闭目标电源供应。 如果你的 STM32 目标具有不同于 32KB 的 flash memory,你还应该编辑 [main.cpp](src/main.cpp) 中的 `size` 参数。 所有设备上电后,Pico 将在串口上重复消息 `Send anything to start...`,这意味着它已准备就绪。按下任意键,它将开始转储内容: ``` Send anything to start... Starting 0x08000000: deadbeef 0x08000004: deadbeef 0x08000008: deadbeef 0x0800000C: deadbeef 0x08000010: deadbeef 0x08000014: deadbeef 0x08000018: deadbeef ``` 你也可以使用 `dump.py` 脚本将其转储到文件中。 # 免责声明 这项工作主要基于 Johanes Obermaier 的论文 [Shedding too much Light on a Microcontroller's Firmware Protection](https://www.aisec.fraunhofer.de/en/FirmwareProtection.html)。我也使用了其部分概念验证代码将其移植到 Raspberry Pi Pico 和 Platform.IO,因此我以与原始概念验证相同的许可证发布:MIT。
标签:PlatformIO, Raspberry Pi Pico, RDP Bypass, RDP Level 1, RP2040, STM32F0, SWD协议, SWD调试, UML, 侧信道攻击, 固件提取, 固件转储, 客户端加密, 客户端加密, 嵌入式安全, 微控制器安全, 故障注入, 数据包嗅探, 硬件安全, 硬件黑客, 竞态条件攻击, 读出保护绕过, 逆向工具