【免费下载链接】PwnPad
PwnPad is an affordable, hands-on hardware hacking platform built for practical learning. It features a range of challenges that walk users through key hardware security concepts, from PCB design to side-channel attacks.
PwnPad 是一款低成本、可动手的硬件破解学习平台,带你从 PCB 设计一路走到侧信道攻击。第14关Ladybirds正是它的经典进阶题:通过ST-Link接上 STM32 的SWD 调试口,用gdb-multiarch停下 CPU、找到固件里的保险箱校验逻辑,再用一句内存补丁绕过去,直接解锁保险箱并读到 flag。本文用最少代码,带你完整走通这套SWD 调试 + 内存补丁的硬件攻击思路。
💡 全程只需一个ST-Link调试器,配合 PwnPad 自带的 STM32F1x 模块 即可完成,无需额外烧录。
认识 PwnPad:你的硬件破解训练场
PwnPad 的核心是一个可插拔、可跳线选择的硬件平台,全部搭建成本约20 美元,完成所有挑战的工具约50 美元即可搞定。它把 UART、SPI、I2C、故障注入、侧信道等真实攻击场景,做成了 15 个循序渐进的关卡。
平台用一个5 位跳线(Challenge Select)来决定当前跑哪个挑战,切换挑战不用重新烧录固件,改好跳线按一次 RESET 就行。这个设计让 Ladybirds 这类 SWD 题可以反复演练。想从零焊一块自己的,直接看官方 docs/PwnPad_building_instruction.pdf。
为什么这题值得做
Ladybirds 是 PwnPad 里少有的黑盒调试 + 逆向组合题,它逼你掌握三个真实安全岗位的核心技能:
- 物理接入调试口:找到 SWD 焊盘、确认电压域
- 调试器工作流:ST-Link → GDB 服务器 → halt 目标核
- 内存/Flash 补丁:不重新编译,直接改运行中的程序逻辑
掌握它,第15关的 JTAG 固件提取也就水到渠成。
挑战目标:用 SWD 解锁保险箱
打开 challenges/14. Ladybirds.md 就能看到本题的官方剧情:一台紧凑保险箱被一段"顽固"的固件校验保护着,你要通过暴露出来的SWD 焊盘,把某个特定内存位置改掉,让保险箱开门。
官方给出的任务清单是:
- 找到并识别板上的SWD 焊盘,确认目标电压域(别想当然当成 3.3V),接好 ST-Link(注意接地与 VTarget)
- 用st-util 或 openocd拉起 GDB 服务器,再用
gdb-multiarch连上 - 停核(
monitor reset halt/ 中断),定位认证例程 - 查看 RAM 与 Flash,找到那道校验
- 打上补丁,解锁保险箱
🎯 通关判定很简单:PwnPad 主板的 handheld_challenge_swd() 会持续读一个输入脚,一旦 STM32 侧把"开门信号"拉高,串口就打印
DOOR STATUS: UNLOCKED和 flag——你的补丁是否生效,一眼可见。
准备工作:硬件与工具清单
| 类别 | 需要的东西 | 说明 |
|---|---|---|
| 调试器 | ST-Link V2/V3 | 提供 SWD 信号与 VTarget |
| 软件 | gdb-multiarch | 通用 GDB,跨架构连目标核 |
| 软件 | st-util或openocd | 为 ST-Link 拉起 GDB 服务器 |
| 线材 | 杜邦线 + 万用表 | 接 SWD 焊盘、测电压 |
| 文档 | SWDJTAG 模块固件 | 理解 STM32 侧"开门信号"逻辑 |
SWD 只用两根信号线(SWDIO/SWCLK),加上GND和参考VTarget就够了,比 JTAG 的 4 线接口更轻量,这也是它被大量量产设备保留下来的原因。
第 1 步:配置 Challenge Select 跳线
按 challenges/14. Ladybirds.md 末尾的Challenge Select表设置 5 个跳线:
1 --> 1 2 --> 0 3 --> 0 4 --> 1 5 --> 1设好后按下主板上的RESET键,PwnPad 就会加载 Ladybirds 挑战。跳线是 5 位二进制选择器(Pin1 为最低位,Pin5 为最高位),这个机制在 challengeSelector() 里实现。
第 2 步:连接 ST-Link 到 SWD 接口
在 STM32F1x 模块原理图 上找到 SWD 焊盘(SWDIO、SWCLK、GND、VTarget / 3.3V),接法:
- ST-Link 的 GND→ 模块GND(必须先共地,防止电平漂移)
- SWDIO→ SWDIO
- SWCLK→ SWCLK
- VTarget→ 目标3.3V参考脚
⚠️ 官方反复强调:别假设是 3.3V。先用万用表量一下目标实际电压域,接错电压是烧芯片最常见的原因。
第 3 步:启动 GDB 服务器并 halt CPU
开一个终端拉起 GDB 服务器(二选一):
# 方式 A:st-util(轻量) st-util -p 32f103 # 方式 B:OpenOCD openocd -f interface/stlink.cfg -f target/stm32f1x.cfg再开一个终端连目标核并停核:
gdb-multiarch (gdb) target remote :3333 (gdb) monitor reset halt此时 CPU 已被halt(暂停),你可以安全地读寄存器、看内存、翻 Flash,而不会破坏运行状态。
第 4 步:定位校验逻辑并内存补丁
停核后,先用x/i $pc看当前指令、用info registers看寄存器,再结合 SWDJTAG.ino 的逻辑:它会读一个输入脚,条件成立才把"开门信号"拉高。换句话说,保险箱锁着的根源是某个判断没通过。
两种常见、非破坏性的打补丁手法:
- 改内存值:找到那个控制"开门信号"的变量/寄存器,直接
set {int}0xADDR = 1 - NOP 掉分支:把校验的
BNE/BL指令改成NOP(0x00 0x00),让程序"无条件通过"
在 GDB 里就是:
(gdb) x/i 0x08000xxx # 找到那条条件跳转 (gdb) set {int}0x20000xxx = 1 # 方案1:直接写内存 # 或 set {hword}0x08000xxx = 0x0000 # 方案2:NOP 掉分支🔧 优先选内存补丁而非改写 Flash——它不破坏固件,随时可重启复位,最安全、最可逆。
第 5 步:恢复运行,读取 flag
补丁打好后恢复运行:
(gdb) continue回到串口(默认 9600 波特率),你会看到:
[+] DOOR STATUS: UNLOCKED ------------------------- TS{5WD_15_P0werFu11_Use}保险箱打开,flag 到手 🎉。想记录进度和提交 flag,可以跑一下本地 Web 应用:
bash ./tools/webapp/start.sh然后浏览器打开http://127.0.0.1:12530提交。启动脚本见 tools/webapp/start.sh。
常见坑位与排错
| 现象 | 可能原因 | 处理 |
|---|---|---|
target remote连不上 | 服务器没起 / 地址端口不对 | 确认 st-util 或 openocd 已运行 |
| 停核后无响应 | 电压域没量对、没共地 | 万用表复核 3.3V,先接 GND |
| 补丁后不开门 | 改错了变量地址 | 回到x/i $pc重新定位判断分支 |
| 一接上就死机 | SWDIO/SWCLK 接反 | 对照原理图交换两根线 |
进阶:从 SWD 到 JTAG(第15关)
搞定 Ladybirds 后,challenges/15. Ladybird I Am Your Father.md 会把难度再提一档:这次保险箱隐藏了固件,你得用JTAG + OpenOCD把整段 Flash 读成二进制,离线做静态/动态分析,再回来打补丁。SWD 的两线调试经验会直接帮你上手 JTAG 的四线接口,这也是 PwnPad 把它俩排在一起的原因。
小结
- SWD 只用 SWDIO + SWCLK 两根信号线,接好 GND 与电压参考是安全前提
- st-util / openocd 拉服务器,gdb-multiarch 停核,是调试 STM32 的标准姿势
- 内存补丁优先于改写 Flash,非破坏、可逆、最安全
- 打通 Ladybirds,你就掌握了硬件安全里最实用的调试口攻击 + 内存补丁组合拳
动手试试吧,PwnPad 的下一扇门,正等着你的 ST-Link。
【免费下载链接】PwnPad
PwnPad is an affordable, hands-on hardware hacking platform built for practical learning. It features a range of challenges that walk users through key hardware security concepts, from PCB design to side-channel attacks.
相关推荐
SerenityOS 移植 GDB 调试器:6 个关键补丁的源码级解析
SerenityOS 移植 GDB 调试器:6 个关键补丁的源码级解析 本篇技术指南以 Ports/gdb/patches/ReadMe.md https://
操作系统内核驱动PX4 Autopilot 使用 MCU-Link 调试探针:LinkServer 与 pyOCD 的 SWD/GDB 完整调试指南
PX4 Autopilot 使用 MCU Link 调试探针:LinkServer 与 pyOCD 的 SWD/GDB 完整调试指南 本文以 PX4 Autop
嵌入式物联网机器人自动驾驶智能硬件os-tutorial 第 14 讲:代码重构、可扩展 Makefile 与用 GDB 调试内核的完整实战
os tutorial 第 14 讲:代码重构、可扩展 Makefile 与用 GDB 调试内核的完整实战 导读 本篇文章聚焦 os tutorial http
示例工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考