免责声明:本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
写在前面:
2014年的12月,由于某次巧合,逛到了Freebuf上关于RFID的文章,然后自己整个人简直要疯了,各种谷歌有关文章……嘿嘿,然后反复反复看(因为我是小白),整理了下大概有以下几处文章比较集中:
又经过了一个寒假的纠结,终于决定入手了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-8 A4 = 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.txt print >>f,data; f.close(); raw_input("输入回车键退出");
输入01 600,得到数据
复制,写入卡片,去试验啦
0×05 后记
银他妈第一次写文章,望各位捧个场呀^_^
[作者/坂田银时,属FreeBuf原创奖励计划文章,未经许可禁止转载]
-
坐等移交开除
还改水卡饭卡,今天10个人一起被抓,透支了不少,坐等开除。
-
感觉不用这么麻烦,记下初始值用完恢复就好了
-
前几天就是这么做的,不过这么一直重放数据没有意思啊,算出算法才是真正的目的。
-
一小渣渣问下银时,你的是ID卡还是IC卡,我的IC饭卡也能用这种方法吗?
-
活学活用 终于产生价值了

不容错过
- Wannacry蠕虫勒索软件处置手册漏洞盒子2017-05-15
- FreeBuf 追踪报道:虫洞(wormhole)漏洞来袭,多款百度热门安卓应用中枪FB独家2015-10-28
- Nessus API连接工具AutoNessusphper2016-06-07
- 一周「BUF大事件」(20160625-20160701)supercoco2016-07-02
0day
已有 98 条评论
活学活用 终于产生价值了
感觉不用这么麻烦,记下初始值用完恢复就好了
前几天就是这么做的,不过这么一直重放数据没有意思啊,算出算法才是真正的目的。
@ 坂田银时 是不是把卡的原来的数据复制保留没钱的时候在复制回去
一小渣渣问下银时,你的是ID卡还是IC卡,我的IC饭卡也能用这种方法吗?
支持你的第一次,支持原创!
多谢捧场:)
赞
Mark
哈哈,看完觉得免费打开水不是问题,破解的过程好欢乐!
破解过程不欢乐,出来结果才欢乐2333333
我这水卡的算法 也有点小复杂,难道水卡都这样
每个厂家都不同的,你也可以顺着这种思路分析嘛
银时来个写卡软件。
@ langyajiekou 这个是会被查水表的囧rz,不过你可以谷歌出来
额 堡垒了..
难怪我看了那么多破解REID的文章 还是不会..
原来我没有买那个180的东东
哈哈
@ 水波摇曳 同感 来握个手
@ 水波摇曳 手机的nfc功能支持吗,一定要买那个180元的?
233当初我们的方法简单粗暴,直接把读卡器拆开,把2根线连起来就能免费洗衣打水了。
卡上写着“故意破坏热水设施的承担全部责任,按50元/天处罚……”
#_#
对于我这样的菜鸟只能看看了 支持一下!
@ 释迦牟尼 . 祝早日也分析出来
不错的文章,学习一下,话说银时这个人物很有意思的
壮大我银魂
对卡片进行破解,R如果不掉线该怎么geek进去啊。
这种不怕查水表? 客服呢?早知道我也投文章了= =
给个x宝链接呗。
不能打广告的呀
@ 坂田银时 私信下呗
有些卡片是以二进制数据来计算的,比如北京单程票。16进制变化看不出来就转化成二进制看看
@ aa 赞,这个尝试过,确实发展了异或的规律
已心动,准备在某宝买机器了
简单看了一下结论,可以推算成所有数据的xor吧
s1 = ‘BDC4BA0A003B1D000018140400E70008′
s2 = ’3F9D9B020062ED00004B490200B4002C’
l1 = [int(s1[2*i:2*i+2], 16) for i in range(16)]
l2 = [int(s2[2*i:2*i+2], 16) for i in range(16)]
In [31]: reduce(operator.xor, l1)
Out[31]: 8 —> l1[-1] == 8
In [33]: reduce(operator.xor, l2)
Out[33]: 44 —> l2[-1] == 44
@ 笑开玩 非常感谢给您出的语法的用法,受益啦。
只是出现所有异或的结果等于末字节,那是前面的都是前后数据的异或+前后两次加和得到(前15字节异或都是0),末尾还是要根据和不变的公式的来计算。
第一个卡的校验位是怎么知道的?
@ 苏一 上面有个结论的,异或得到
破解的過程好歡樂
真是太感谢你了,我这几天也在破解水卡,但是也是卡在了校验位的那块~刚刚看了你的文章一下子明白了我自己的问题,再感谢一次。还有一个问题,你会复制卡吗?就是将一个M1的卡的数据复制到一张空白的卡上面去? 最后,再感谢一下!!!!
@ 卿君莫笑 算出来那一刻很鸡冻吧哈哈,只要数据和密钥没错误,写到对应的扇区就可以了!
刚刚进行了测试~确实是对的真的很激动,再谢一次~但是uid会提示出错啊?
普通卡0分区是不能写的。你看卡的key和uid有关系吗?
我的key是可以改写的用kali但是 uid没法改
@坂田银时 我有个卡1扇区只有第4块能写,567都不能是怎么回事?
提示你一点吧,有的厂商会把uid的一部分,或者uid进行换算来当作key。你不能改uid就改变对应key也奏效。
@ 卿君莫笑 我也想知道 目前我还是理论上得
@ 坐等移交开除 小打小闹,有自知之明就行,别做违法的事!
@ 坐等移交开除 只要卡不是自己名字就好了啊 例如捡到的
玩玩还行,要是真这么用就是做死的节奏
这不是我们小组在做的嘛,以为会很安全
测试两个开水机器是否包含数据通信的图是不是错了?应该是一次扣1元?我怎么看糊涂了
@ 千秋丶千年 原本两次总共应该扣3元的,只是扣2元后的余额数据被扣1元后的余额覆盖了,所以就扣了1元
”只有12V2A的两根电源线的输出,可以放心了。“
公交卡也是离线的,只不过到站了会把记录的数据传后台,小心查水表。
@ taylorwin 多谢提醒,只是水表和卡机是一体的,不会拆的:-D
公交卡破解不了怎么办。。。
我们那儿公交卡有默认扇区,可以破解
那两个dump对比的APP是什么?MCT?
膜拜。。。。。
话说 最近在搞的时候 不知道是驱动的问题还是读卡器的问题 读完uid之后 开始读取扇区 内容的时候 就会断开链接 up主遇到过这种情况吗
是破解时候还是正常时候?驱动装了吗?
我试了一下感觉我那个比较简单 = = 对比一看 就四个十六进制不一样,高位低位排好位置 转十进制就是了。。
有的确实简单,校验位都没有
求全部工具
国外不用这个
我们这的卡消费时候数据不变,我的卡都刷到0元了数据也没有变化,可是我去充值的时候卡里的数据就变化了,这种是什么情况呢?
饭卡记名的不太敢玩脱….
我公司也有洗澡卡 好像什么一卡通 不知道怎么破解 来个方案
1202070000000000000000000000001B0000020700004633FFFFB9CC000000050000020700004633FFFFB9CC00000005
1202070000000000000000000000001B0000020500004A89FFFFB576000000030000020500004A89FFFFB57600000003
这是一张卡两次的数据,求大神告知如何校验的,光改ffff两边的数校验无效
@ jollyjay 你要根据金额算校验位,当然不能直接改
@ 坂田银时 大神帮我看看应该怎么算啊,对异或这个实在是门外汉啊
想起当年的游戏巫师GW[噢耶]
不吃食堂路过,技术宅可以试试→_→
学校饭卡[doge][笑cry]
坂田银时你的QQ是多少?大神我有问题向你请教一下可好?
@ 菜鸟 你可以私信我你的qq
@ 坂田银时 1106686653
分析:
楼主你好,我想问问一下这个43 是怎么得出来的?
40.00元对应十六进制 0FA0 校验位EC,0F xor A0 xor EC = 43
34.48元对应十六进制 0D78 校验位36,0D xor 78 xor 36 = 43
结论:
校验位:余额转化成十六进制后异或,再与0×43异或。
现在我有一组数据
1.70 对应00AA 校验码 D5
1.80 对应00B4 校验码 DF
然后按照你的方法
00 xor AA xor D5=7F
00 xor B4 xor DF=6B
得出来的数不一样啊? 我这个数据校验码是怎么计算的? 还有很多问题不太明白,可以私信下你的qq吗?谢谢。
@ kenfuni2 这个不是唯一的算法,你看看还有其他不同的数据没有,你可以直接私信给我!
@ 坂田银时 你好,我现在有几个dump文件,比对后知道金额区位置,但是不能确定校验情况,可否发你试试?谢谢!
请问我的KEYA显示为————是因为没有破解成功吗?
010400242064EA3100D38700000000DE
010400242064EA3100694B0000000084
010400242064EA3100AD7F000000000C
010400242064EA3100AE50000000003A
这是我卡的4次数据,不知道怎么算啊,求大神帮忙,只知道最后一次余额是141
改后第一次刷的显示余额的多少?599.99么?
我们读卡器上有4跟线,直接拔了数据通讯线
m1 16扇区都加密能破解吗?ving card门锁卡有大虾能破解吗?
亲。能给个机器入手的地址吗?
就是你那是什么对比工具,能请教下,有些问题不会