破解校园水卡

###0x00前言

今年校园洗衣机升级换代,采用了更为安全的微信支付。可是在以前校园用的是刷卡洗衣的,这种卡就是IC卡。比较坑的是一张卡10次30元,洗一次衣服要3元,完全都我喝一杯牛奶了。崇尚节俭的我便开始打IC卡的主意,IC的安全性很低,只要用心的人就能随意的改动卡里面的内容。下面就回忆一下,由于现在手中没了卡,许多截图都是以前做测试留下来的。

破解着这种卡的技术可能早已经被玩烂了,但今日发的这篇文章只是为了记录一下以前调皮捣蛋的生活。成功破解卡之后,并没有与别人交流,也没有借此拿来售卖。我还是害怕辅导员把我踢出去的。
同时声明:此次分享只作为技术交流与实验,切不可用于违法犯忌的行为。
(我知道对于想搞事情的萌新,说了也没用!唉!)

###0x01达成效果
修改水卡的次数,达到较多次(10+),方便使用。


###0x02前提准备(Windows)
1.洗衣卡一张(ICcatd)
2.NFC读卡器(某宝售价40~100)
3.配套的软件

4.数据内部算法的分析

###0x03IC卡
IC卡即集成电路卡(Integrated Circuit Card),是超大规模集成电路技术、计算机技术以及信息安全技术等发展的产物。它将集成电路芯片镶嵌于塑料基片的指定位置上,利用集成电路的可存储特性,保存、读取和修改芯片上的信息。

按照与外界数据传送的形式来分,IC卡有接触式和非接触式两种,校园的水卡就是简单的非接触式的M1规格的卡。最简单的区分方法就是拿手机后面的灯光照射卡的一面,从另一面观察有一圈的铜线圈,这种可以说方便使用,同时也容易搞事情。

###0x04设备与软件使用

ACR122u-A9非接触式读卡器门禁读卡器 ,

ACR122u-A9非接触式读卡器门禁读卡器
工作原理

读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。

通过USB接口链接电脑,显示灯亮起表明可以使用。
最麻烦的是驱动的安装,与对应软件的选择,由于我的设备不是在某包买的,从学长的手中强行搜刮下来,所以是没有任何的软件的。这些我自己找啊!

安装驱动,我用的软件是从网上千挑万选出来的几个,个人感觉十分的顺手方便使用,一个安装驱动的软件可以通过检测连接的设备,找出对应的驱动,这个软件可以说异常的好使。如果想玩这类设备的朋友,可以在留言区留下自己的邮箱,在一天之内可以免费发送给你(前提我没有脑子抽抽重装系统之前吧,谁也说不定),玩技术无国界。

使用软件
1.爆破软件
2.修改软件

3.写入数据软件

爆破软件

爆破软件截图

打开爆破软件,将卡放到NFC的读卡器上面,点击选择读卡器,等待卡片信息和卡片状态,点击开始破解,对于加密的内容不同,等待5~15分钟,就会破解完成,生成dump的文档。(这里得到的文档是压缩过后的,在lunix下获取到的是4kb的元文档)
在这个dump的文档中,就是这个卡片的信息,显然这样的查看方式是不方便的额!所以在修改软件中查看
Dump信息
修改软件
打开修改软件,导入Dump的文件,16个扇区,每个扇区有4块内容

修改软件的截图
16个数据存储区,通常我们称为“扇区”,编号是“0”到“15”。每个扇区又分为4个存储单元,我们称为“块”,在M1卡中数据存储的最小单位就是“块”。每一块有16字节(16B)

第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改.

在全扇区加密时,通常用前三个“块”(0,1,2号块)存放数据,用最后一个”块“(3号块)存放密码。其中密码分为A密码和B密码:前6个字节存放A密码,中间4字节为控制字段,后6字节存放B密码。注意这里每个扇区的密码都是独立的,也就是说可以为16个扇区设置16个不同的密码,当然也可以使用相同的密码,但是这样会大大降低破解的难度,破解的问题就交给软件完成.

每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:

块0:   C10   C20   C30
块1:   C11   C21   C31
块2:   C12   C22   C32
块3:   C13   C23   C33

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如
进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制
位在存取控制字节中的位置,以块0为例:
对块0的控制:

bit  7    6     5        4     3      2      1      0
字节6                      C20_b                          C10_b
字节7                      C10                        C30_b
字节8                      C30                        C20
字节9                                   
            ( 注: C10_b表示C10取反 )

  存取控制(4字节,其中字节9为备用字节)结构如下所示:
 bit   7       6       5        4      3        2       1      0
字节6    C23_b    C22_b    C21_b    C20_b    C13_b    C12_b    C11_b    C10_b
字节7    C13        C12        C11        C10        C33_b   C32_b    C31_b    C30_b
字节8    C33        C32        C31        C30        C23        C22        C21     C20
字节9                                
                 ( 注: _b表示取反 )

当块3的存取控制位C13 C23 C33=1 0 0时,表示:
密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。
存取控制:验证KEYA或KEYB正确后,可读、可写。
密码B:验证KEYA或KEYB正确后,可读、可写。

根据最后介绍的的数据算法分析,双击软件中数据内容,修改对应的数据
写入数据软件
简单操作,连接读卡器,连接卡片,写卡。完成卡片的修改。

写入数据截图

###0x05数据内部算法的分析
对得到的数据进行分析,解密是个有意思的事情,前面的基本操作没有任何的挑战性,现在我们要去修改它里面的次数,就要找到表示次数的那些扇区中的那些块表示次数。如何让这些表示次数的数据显示出来?
我又花重金买了一张卡,拿着这张卡去刷,每刷一次就记录一次,得到大约11次的Dump文档,分析文档中改变的数据。改变的数据就表示次数。经过几次的比较大概就知道了表示次数的数据。分别拿出这些数据,找出规律。然后在根据得出的规律去构造出你想要改成的次数。

3次数第一扇区第〇块

现在发现第一扇区的第0块每次刷卡后都改变,然后将10次数据提取出来,进行分析,推算出他的算法。
选取部分数据找规律

C800000037FFFFFFC800000008F708F7        2次
2C010000D3FEFFFF2C01000008F708F7        3次
901000006FEFFFFF9010000008F708F7        4次
F41000000BEFFFFFF410000008F708F7        5次
58020000A7FDFFFF5802000008F708F7        6次

举例3次

2C010000      D3FEFFFF     2C010000    08F708F7

分成四部分,发现第一部分和第三部分相同,第四部分对比数据后是个不变的值。

在最初的想法是找到与对应次数的数字,次数会不会直接写在里面,结果对应的数字不能完全符合规律。再次假设字母的个数与位置,也不能符合全部的规律。
这些数值对应的是16进制,3次中的“3”在洗衣机上面显示的是3.00,3对应的十六进制是不变的,那要是3.00 = 300呢?对应的十六进制是多少?

300转十六进制
300(十进制)=12c(十六进制)
有没有发现和第一部分的数字很像。然后测试400、500
400(十进制)=190(十六进制)
500(十进制)=1f4(十六进制)
对于三次数据,这样可以理解为间第一部分的数据拆成

300(十进制)=12c(十六进制)    
2c   01   0000

这样第一部分的算法就知道了,第三部分和第一部分相等,第四部分不变。就差第二部分的解析。
将十六进制翻过来就是

1  2  3  4  5  6  7  8  9  A  B  C  D  E  F 
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
F  E  D  C  B  A  9  8  7  6  5  4  3  2  1

第一部分对应第二部分

2C010000     
D3FEFFFF 

第三次的数据的算法:2C010000++D3FEFFFF++2C010000++08F708F7

反汇编,推算试着写一个6次的
600=0258
0258=>5802
58020000=>A7FDFFFF
58020000+A7FDFFFF+58020000+08F708F7 和读出的数据进行对比
58020000A7FDFFFF5802000008F708F7 6次完全一样
这样试着写一个52次的
50140000+AFEBFFFF+50140000+08F708F7
最后拿去洗衣机验证成功,没有截图。

对于想对你的卡进行试验的的朋友,可以参考本文,特别声明,此文章只作为记录先前的生活,需要软件的朋友,在留言区留下你的邮箱地址!