52梯控论坛

标题: 一次M1卡(洗澡卡、开水卡)破解历程 [打印本页]

作者: ok120    时间: 2018-12-23 10:04
标题: 一次M1卡(洗澡卡、开水卡)破解历程

又经过了一个寒假的纠结,终于决定入手了ACR122U,只是到手后机器看上去确实感觉比¥180要廉价,看图就明白了:

不过这个机器的价钱对初级的RFID研究算是合适的。

好吧,跑题了……

0×01密钥的获取&可行性分析

楼上几位大牛的M1卡的密钥破解过程非常详细,我写不出那么细致的文字,就在此略过吧。

在这次实验中:我手头有两张M1卡,洗澡卡(xzk)和开水卡(ksk),在对卡片进行破解的前后应该注意的是卡片的数据是离线的,即机器是没有联网的。

这是洗澡卡的读卡器的电源:

只有12V2A的两根电源线的输出,可以放心了。

开水卡的机器让我有些纠结,两台机器后只有一根很粗的漆包线(不敢扯出来看,左手边一个摄像头),不确定里面是否包含数据通信,纠结了几天后想到了如下的办法测试:

0×02开水卡数据的分析

这里先分析开水卡因为校验的算法相对洗澡卡的实在太简单了,囧

分析:

40.00元对应十六进制 0FA0 校验位EC,0F xor A0 xor EC = 43

34.48元对应十六进制 0D78 校验位36,0D xor 78 xor 36 = 43

结论:

校验位:余额转化成十六进制后异或,再与0×43异或。

0×02 洗澡卡数据的分析

首先对几组数据进行分析

经过简单对比可以得到如下结论

但是到这里我几乎要放弃了,因为根本找不出得到首位与末尾字节的异或算法,之后的三天每天就拿点时间出来比较计算,对比数据每次的变化规律,于是发现了如下规律:

可以发现方框里每次变化量的和为0,接下来用A0、A1、A3……来表示每一字节的数据

经过推算,可以发现 A1+A9+A15=E4

为了判断这是否是一个固定值,就拿同学甲的数据进行对比

可以发现 A1+A9+A15=114

再拿同学乙的数据对比

可以发现 A1+A9+A15=1E4

这里发现了点端倪:

1.三组结论的末尾都是4;

2.同学甲与同学乙的结果区别在于 114与1E4,而两张卡的UID首字节是 ED与1D;

3.如果这个结果与UID首字节相加呢,以上的三组数据结果 A1+A6+A9+A15分别为  

                101  ←智商有限,只能先下假设与 A11=04 有关        201  ←A11=02        201  ←A11=02

到这里可以下一个定论了,当A11是02时,可以由一下公式得到数据的末位

A15= 0201-A1-A6-A9

接下来就是判断首位A0的计算方法了,这个数据找不出与计算末尾一样的变化规律,那么就进行各种异或运算吧:

从发现的第一个规律可以看出前后的计算校验的方法有些类似,那么就以中间的1D展开

这是甲乙两人都是6.61元时的数据情况,对A0和A6进行异或可以发现都是DF

接着进行无数次的尝试终于发现了上图中方框的各个字节进行异或运算的结果都是0

那么推出首位A0的计算公式为

A0= A2 xor A3 xor A6 xor A10 xor A11

(简直要哭瞎啊,这是哪位程序猿写的啊)

0×03 洗澡卡数据的伪造

知道了算法下面就是验证的时刻啦,先来100的数据

8437102700C81D0000AEAC02005100FF     可行

8537102700C81D0000AFAD02005000FE     可行

2837102700C81D0000020002005000AB     不可行

为何不行呢

由于A10太小,造成造成A1+19+A15=101,而不是201

那么就让A9=FF吧

D537102700C81D0000FFFD02000000AE     可行

接下来又发现问题了,如果余额转换成十六进制后,

A2与A3的和即A1大于FF呢,那不造成了要向A0进位?

A10与A11的和即A9大于FF呢,那不造成了要向A8进位?
结果A1+A6+A9+A15=301,这么纠结…………

为了避免A11的影响,把公式里的A9换成A10吧,对应的公式为

当A2+A3大于1FF时,A15= 2FF-A1-A6-A10

当A2+A3小于1FF时,A15= 1FF-A1-A6-A10

A0 = A2 ^ A3 ^ A6 ^ A10 ^ A11    (^表示异或运算)

数据的分析破解工作就到此结束了,真心麻烦啊!

0×04 交给电脑完成计算

这么坑爹的计算方法要是拿计算器按,再一个个填入MCT,浪费时间不说还容易算错。

于是打算交给电脑,自己只会vf(这个貌似帮不到忙),c语言(进行十六进制计算不方便)

然后百度了下最近眼熟的python,居然还有hex()函数,哈哈,现学现用啦。

第一次写python,for的用法还不熟,不会直接输出十六进制字符串,大牛们表喷,嘿嘿:

# coding: utf-8A4 = A7 = A8 = A12 = A14 = "00"; A11 = "02";a11 = 0x02;a6 = 0x4b;IDnM = raw_input("请输入学号与金额(例如:01 200):");ID = IDnM [0:2];Money = IDnM [3:]+"00";               #字符   Decmoney = int(Money,10);             #十进制Hexmoney = hex(Decmoney);              a2 = int(Hexmoney[4:6],16);           #十六进制a3 = int(Hexmoney[2:4],16);           #十六进制a1 = a2 + a3;a5 = a1 ^ 0xff;if a1 > 0xff:                         #A1此时验证是否大于0xFF  a10 = 0xfe;  a15 = 0x2ff - a1 - a6 - a10;        #A15校验位else:                                 #A1此时验证是否小于0xFF  a10 = 0xec;  a15 = 0x1ff - a1 - a6 - a10;        #A15校验位a0 = a2 ^ a3 ^ a6 ^ a10 ^ a11;        #A0校验位a9 = a10 + a11; a13 = a9 ^ 0xff;print ID, "号当前金额为",IDnM [3:],"元";print "10扇区对应数据为:";A0 = hex(a0)[len(hex(a0))-2:];A1 = hex(a1)[len(hex(a1))-2:];A2 = hex(a2)[len(hex(a2))-2:];A3 = hex(a3)[len(hex(a3))-2:];A5 = hex(a5)[len(hex(a5))-2:];A6 = hex(a6)[len(hex(a6))-2:];A9 = hex(a9)[len(hex(a9))-2:];A10 = hex(a10)[len(hex(a10))-2:];A11 = "02";A13 = hex(a13)[len(hex(a13))-2:];A15 = hex(a15)[len(hex(a15))-2:];data = A0+A1+A2+A3+A4+A5+A6+A7+A8+A9+A10+A11+A12+A13+A14+A15;data=data.replace("x","0").upper();print data;f = open("card.txt","w");              #将数据写入同目录下的data.txtprint >>f,data;f.close();raw_input("输入回车键退出");

输入01 600,得到数据

复制,写入卡片,去试验啦

0×05 后记

银他妈第一次写文章,望各位捧个场呀^_^



作者: yuwenyongfei    时间: 2018-12-23 11:30
沙发,学习一下!
作者: 锁匠丹东    时间: 2018-12-23 11:40
看帖回帖是美德!:lol
作者: 兄弟干了    时间: 2018-12-23 17:31
支持一下:lol
作者: 老二大哥呢    时间: 2018-12-23 19:39
前排支持下
作者: 老二大哥呢    时间: 2018-12-23 21:20
:lol不错
作者: wangjian    时间: 2018-12-23 23:08
学习一下,谢谢分享!
作者: daixiuchen    时间: 2018-12-24 05:58
沙发,学习一下!
作者: CHENCHI888    时间: 2018-12-24 08:25
貌似非常深奥
作者: baixuefeng1128    时间: 2018-12-24 10:23
路过,好好学习一下。
作者: baixuefeng1128    时间: 2018-12-24 10:23
路过,好好学习一下。
作者: wtfwfnai    时间: 2018-12-24 11:18
很好的搬运工
作者: daagege    时间: 2018-12-24 11:49
这是原创帖子吗???
作者: 岩鹰    时间: 2018-12-24 12:59

学习一下,谢谢分享!
作者: 步步高    时间: 2018-12-24 13:48
专业

作者: 爷爷    时间: 2018-12-25 07:45
看帖回帖是美德
作者: swnning    时间: 2018-12-29 15:33
厉害,,,,,
作者: 20190101xin    时间: 2018-12-29 16:27

作者: 爷爷    时间: 2018-12-30 09:06
看帖回帖是美德!
作者: cqes123    时间: 2018-12-30 09:29

作者: shinying    时间: 2018-12-30 09:29
看帖回帖是美德!
作者: yekucao    时间: 2019-6-11 09:32
了解一下,学习中
作者: icicic    时间: 2019-6-11 10:12

作者: wangjw    时间: 2020-7-21 16:55
这也太高深了,还得慢慢学习啊
作者: minghai    时间: 2021-1-16 11:19
学习一下,谢谢分享!
作者: sjl4454069    时间: 2021-7-26 04:06
厉害~我完全懵逼状态~~~~
作者: 李夏    时间: 2021-9-27 19:34
看了半天都没有整明白,比较法看懂了一点,多学吧。
作者: shhb361    时间: 2022-9-28 22:30
写的太高深了,有没有工具呢


作者: ontheway    时间: 2023-2-12 13:05
学习一下!
作者: handyi    时间: 2024-5-6 16:14
真牛啊,学习了




欢迎光临 52梯控论坛 (https://52tikong.com/) Powered by Discuz! X3.4