[RFID] 精格水卡分析

Author Avatar
秋のかえで 9月 21, 2019
  • 在其它设备中阅读本文章

0x01 缘起

吼吼吼,咱上高中惹QAQ。作为人称白嫖酱(迫真)的我,当然是要白嫖一波的,饭卡数据是在数据库的,无从下手……咱就瞄准了学校的饮水机。
花了咱50大洋办了一张卡,然后带上PN532(亏死),就开始了咱的白嫖之旅。
厂商是一个叫精格的厂,从电话用移动电话号码就能看出来不算大厂。

0x02 解密

怎么做的咱就不多述了,是一张标准的Mifare Classic 1K Card,仅仅加密了一个扇区,丢去跑mfoc花了不到2 min就出来了,早知道就不该花钱去办卡。
饮水机是没有任何安全措施的,用UID卡(Mifare Magic Chinese Card Generation 1)也能刷,也不校验厂商,我就顺带复制到了咱的小米手环4 NFC里面了(刷起来很拉风)。

0x03 分析

用完了再写,无限使用?不,当然要更暴力的。于是刷了几次卡,dump出数据,经过对比,得到如下结果。
扇区14 Block 56-58
金额:¥44.92

1A 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
0A 3E 00 08 00 00 11 8C 00 00 00 00 00 00 00 00
0A 3D 00 1E 00 00 11 76 00 00 00 00 00 00 00 00

我们可以很容易发现Block 57的7-8字节是金额*100后转16进制。我发现第4字节是上次消费的金额*100,而Block 58的第4字节(0x1E)则是固定不变的。
那么Block 58的第7-8字节呢?很明显是校验算法,我们可以得到 Block 58 7-8 bits = Block 57 7-8 bits + Block 57 4 bit - Block 58 4 bit
那么Block 57/58的第1-2字节呢?我发现,每次刷卡他们都同时+2,并且Block 57总比58要多1,至于干什么的,咱下面再讲。
Block 56的数据没有发生过变动,咱暂时认为它是充值次数吧。
做到这,咱就迫不及待地改了一个0xFFFF(即¥655.35)去刷,然而报错了。经过不断的摸索和练习,我最终锁定了0x4E20(¥200.00),测试能用,数据如下。

1A 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
0A 48 00 00 00 00 4E 20 00 00 00 00 00 00 00 00
0A 47 00 1E 00 00 4E 02 00 00 00 00 00 00 00 00

到这里还没有结束,后来我发现了不一样的状况,那就是57和58的数据是反过来的,这也就很好解释为什么两者的1-2字节会差1了。

金额:¥43.00

1A 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
0A 7A 00 1E 00 00 10 AE 00 00 00 00 00 00 00 00
0A 7B 00 00 00 00 10 CC 00 00 00 00 00 00 00 00

至于到底是怎么反过来的呢,我个人猜测是随机的,因为第一次充值(未使用)的数据是这样的,至于是到底怎样还要尝试。
金额:¥45.00

1A 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
0A 3A 11 94 00 00 11 94 00 00 00 00 01 00 00 00
0A 3A 11 94 00 00 11 94 00 00 00 00 01 00 00 00

0x04 后续

因为有同学在网络上购买水卡被校方发现,支付系统被暴力改造,终端通过GSM连接网络……算一算我还亏了

本文使用 CC BY-NC-SA 4.0 授权
本文链接:https://blog.akinokae.de/archives/jingge-card-algorithm/