THUCTF2023 IoT 赛道 WriteUp

IoT x 数字逻辑实验 √

Barcode

我不理解这道题为什么会突然出现在 IoT 赛道

运行代码得到 flag THUCTF{God_say_let_s_there_be_code_1}但是这个 lets there be 是什么鬼

from PIL import Image

im = Image.open("output.png")
data = im.load()

b = ""

for i in range(12, im.size[0], 24):
    b += "1" if data[i, 0] == (0, 0, 0) else "0"

print("".join([chr(int(b[i : i + 7], 2)) for i in range(0, len(b), 7)]))

STM32

首先你要明白这题不需要你给 STM32 编程虽然后来想起来感觉很蠢但我一上来先装了个 STM32 IDE装完感觉不对

然后需要把线连对而把线连对最主要的是把 pin 看对芯片把圆圈放在左上角晶振多出来一个直角的那个角是一号脚编号是逆时针转圈依次编

UART

把 USB to TTL 输出的 3V3 和 GND 接到板子和晶振把晶振的输出接到 OSCIN把 UART TX (PA9) 接到 USB to TTL 的 RX然后就可以通过串口读到 flag

USB

按照电路图把 PA11 接到 USB 转 5pin 的 D-把 PA12 以及 5V 串上电阻接到 D+根据代码中的判断条件还需要把 PB6 和 PB7 接地然后插到电脑上会周期性把 flag1 THUCTF{B4D_USB_H1D_KEYB04RD_!!} 以键盘的方式输入到电脑上而设备的名称是 flag2

usb-2 flag

SWD

把板子的 RST, SWCLK, SWDIO 连到 ST-LINK 上然后插到电脑上

参考 stlink/doc/tutorial.md通过 st-util 启动 GDB server然后启动 arm-none-eabi-gdb输入 layout asmtarget extended-remote :4242设置断点 b *0x800069c然后 killrun在断点观察到汇编如下

asm branch

此时 jump *0x800069e 即可在串口接收到 flag1

uart swd-1 flag

查看 sp 的值然后打印栈上的字符串即可看到 flag2

swd-2 flag

这是你的电路板吗?这就不是!

使用搜索引擎找到 https://www.altium.com/viewer/ 用它打开附件中的 Hi3861.zip可以看到 flag 的后半部分再在 layers 中设置只查看 top / bottom overlay 就可以看到整个 flag

top overlay

bottom overlay

Harmony - Turn up the light!

查看电路图得到答案是 GPIO02

led gpio