今年的GEEKPWN互动游戏环节是点亮胸卡上的灯。
胸卡的设计很有特点,设计的思路是灭霸的拳套。
参加GEEKPWN不同身份的人,胸卡上的默认身份宝石也不一样,点亮其他宝石的方法就是跟不同身份的人碰一下胸卡下面的红外传感器,即可点亮。
主办方是绿色宝石,也就是灭霸拇指的那颗。需要找主办方身份的人碰一下胸卡才能亮。青色的宝石是需要答题的,找到胸卡中闪烁的密码,到达指定位置,官方人员才会同意和你碰一下胸卡 才能点亮这个灯。
但是,明明是极客大会。主办方甚至要求上厕所都要答题(憋了笔者30分钟)这么难为我,难道我要点亮个胸卡也要被主办方难为难为吗?当然这是不存在的。
0x00硬件分析MCU
型号:上海灵动微电子 MM32F031C8T6(上海本土产品)
这个mcu的数据手册以及用户手册在他们公司官网上都有,这样更好的便于我们来分析一下胸卡上的调试接口分别是做什么的。
调试接口 一共有两组调试接口,由于笔者目前还没有回家。还在当地玩,没有带jlink。故此无法提取出mcu中的固件进行逆向分析。
但笔者手中有一个万用表,可以根据数据手册来量出引脚定义
从左往右数,从方形焊盘到圆形焊盘的针脚分别为 :
GND
UART1/RX
UART1/TX
NC
NC
猜测构成了UART接口
从右往左数,从圆形焊盘到方形焊盘的针脚定义分别为
NRST
SWCLK
SWDIO
GND
DVDD
猜测构成了SW接口
笔者已经尝试了在UART接口中读取调试信息,但什么都没有读出来。波特率115200和9600都测试过了。
传感器及其他
一个红外发射管+一个红外接收器,用于不同种类的胸卡交换数据。互相点灯用的
九个RGBLED贴片式灯珠 + 各种密密麻麻的阻容
0x02 上电测试 首先普通用户的胸卡是这样的 只有紫色宝石会亮
组委会的胸卡是这样的 只有拇指上的绿色宝石才会亮
来一张合照
当两个胸卡的下面的传感器摩擦一下的时候 两张胸卡会给各自点亮自己的灯
到十分钟以后 会以CW等各种方式显示明文为 2019 1024 GEEKPWN的密码
0x03 破解思路 最早笔者认为。如果说引出了uart脚位,那么调试应该在uart上。但奈何笔者水平有限,在uart上无法读到任何debug信息。 但是笔者在胸卡上找到了一个有趣的地方,那就是这个位置
这个位置的两个方形的焊盘引起了我的注意 拿万用表量了一下 。
左边的那个焊盘接到了一个电阻上,电阻对端接到了MCU上的PB9的IO上。右边那个焊盘直接接地。
这不是明摆着那个电阻是下拉电阻嘛 只是没有触发而已。万用表直接开启电流档 上电点一点试试看,并没有什么反应,短接后开机试试。
这时貌似胸卡自动进入了什么模式 开机所有的灯并不是所有颜色都闪一遍,而是9个灯循环了三次跑马灯。然后第一个黄色灯亮起。
再次短接,我们会发现他会跳到红色的上面。每短接一次,他都会跳到下一个灯上。
这时 在用另外一个胸卡刷,我们会发现 另一个胸卡的所有灯的数据都会被清空 只亮一个黄色的灯,而且这张胸卡的默认身份灯会自动变成黄色的灯
把第一个胸卡的电池拔掉 在安上,这时候我们会发现第一张胸卡上的指示灯已经还原。
这时,我们在用第一个胸卡摩擦第二个胸卡,这时候我们会发现 第一张胸卡的黄色灯已被点亮。
可以循环使用这种方法点亮一张胸卡,但另一张胸卡只能亮两个灯。另一张胸卡怎么办呢?等我回家在直接写个新的程序(不存在的!!!),把胸卡里的灯全部点亮。这就完美粗暴的解决了。
变身!!!