Syscan360电子胸卡分析
Syscan360大会闭幕半个多月了,其中有个破解电子胸卡的环节吸引了不少眼球,而且官方提供了解题思路。经过本人研究后发现,解题方案还可以大幅优化,而且如果用USB连接到胸卡的串口,通过破解提示,大概不到1分钟就可以破解….
首先感谢360提供这个游戏
感谢钱老师提供胸卡供分析.
神图镇楼
让我们先从电路开始分析.
电路分为独立的两个部分,上半部分是电子胸卡,下半部分应该是USB名片功能,两个电路没有关系.
电路说明:
先看主控芯片:
电子胸卡部分使用Atmega16A作主控,属于Atmel公司AVR系列8位单片机, Geek们玩的Arduino就是使用的AVR系列的芯片.
[Atmega16A引脚]
对照电路板我们可以知道:
PB5,PB6,PB7连接到USBISP接口
XTAL1,XTAL2没有连接,使用内部晶振,频率由熔丝位设置
RXD,TXD连接到串口
PD3(INT1)连接到LED按钮(外部中断1)
PD5,PD6,PD7连接到74HC595
PC0-PC7连接到KeyA
PA0-PA7连接到KeyB
PB4连接到DS2411序列号芯片
完整的电路图: 使用Proteus 7.8绘制,可仿真
序列号芯片部分:
电路板上使用的是DS2411硅序列号芯片
DS2411只有3个引脚,1个电源,1个接地,只用1跟数据线就可以通信,连接到Atmega16A的PB4
这个芯片48位的序列号,ID就放在这里面
由于proteus没有这个芯片,只能用同样支持1-Wire协议的温度传感器DS18B20替代了,通过在proteus设置芯片属性里面的ROM Serial Number可以修改序列号,注意大小端
LED显示部分:
使用4片74HC595级联,顺序为
74HC595是移位寄存器,通过规定的时序可以向芯片发送8位数据,并可以控制其移位,如果使用级联的话,最高位移位时移到下一个芯片的输入.
74HC595的QA-QH连接到LED,RCK连接到PD5,SCK连接到PD6,SI连接到PD7,SQH连接到下一个74HC595的SI(输入)
拨码开关:
拨码开关刚好8位,正好接到Atmega16A的PC口和PA口
读取程序:
把USBASP下载线,接到电路板上.注意对应引脚
使用AVR_fighter软件读取芯片信息
芯片加密熔丝位没有设置,意味着可以读取里面的程序
程序分析:
顺利读出程序.拽到IDA里分析,处理器选择Atmel avr series: avr,确定后选择设备 Atmega16_L,下一步的EEPROM不用选择,程序没用到
IDA 只能识别静态调用的函数,剩下的可以手动识别,
全部代码大约有5000行,除去没有调用的,也有3000多行,全部分析是不可能的.只能看重点了,而且大部分代码是显示时序逻辑,没有分析价值
[main函数]
我们只看上面,下面是显示逻辑(左边的流程是循环闪烁,右边的流程是循环旋转.)
进入main函数先初始化端口,中断,设置串口波特率等.然后调用GetID函数.
GetID函数里面使用1-Wire协议读取DS2411中的序列号, 存放到内存中g_bID0-g_bID3
然后main函数中调用休眠函数,进入休眠状态,等待LED按键按下
LED按键按下后进入INT1中断处理函数
函数中清除通过状态,使用循环延时防止按键按下的过程中接触不良引起的抖动再次触发中断.
按键中断处理完后,休眠结束,回到main函数继续执行
当g_bState为1的时候,调用Check函数,检验密码
进入函数先点亮全部LED,然后获取KEYA和KEYB的按键状态,
按键的每4位作为一个单位和序列号芯片里的ID的每个字节的低4位比较,根据比较的结果设置标志位,存放到nKeyPass中,0-3位分别表示KeyB的高位,KeyB的低位,KeyA的高位,KeyA的低位是否通过.把这个结果输出到LED显示.每个位的通过与否使用90度的LED显示.
在Check的结尾判断是否通过,通过的话设置通过标志;没有通过的话向串口输出按键B和按键A的16进制数值,并调用SEND_COM函数显示破解提示;
向串口发送破解提示字符串,并发送g_bID0-g_bID3的ASCII码.
破解提示:
连接到串口后,看破解提示,有个8位的ID,取每个字节的低4位,比如0324180C,密码就是348C
如果电路板拿在手里电池在左下角的话,即KEY_A的1引脚连接到Atmega的PC0, KEY_A的8引脚连接到Atmega的PC7,最高位在最右面,和我们的习惯不一样,要把电路板倒过来,让电池在右上角,这样就可以直接输入提示的密码了….
输入的顺序为:
1234的位置,分别输入348C的二进制就可以了..应该不会超过1分钟吧…
附: Protues仿真软件使用
使用Proteus打开Badge.DSN文件,设置DS18B20的序列号(注意大小端),按F12开始仿真,点击拨码开关输入密码,然后点LED按钮.密码错误的话,串口窗口可以显示提示.
串口窗口:
PS: USB名片芯片里面的程序没有读取到,可能本来就没有,或者是被我自己不小心擦除了.
PS: 泼水解法应该是DS2411被短路,GetID函数取到的ID是全0,按键全部拨到ON位置,即全部接地,PC口和PA口读到的Key为0,所以可以解开密码.
PS: 程序和电路图版权属于360,不提供下载
附: 文档
Syscan360胸卡分析_.part1.rar
Syscan360胸卡分析_.part2.rar
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课