工具:ACR122U、Mifare One卡分析工具、Mifare 卡數據寫入工具
實驗對象:自己的飯卡
以下是從卡中讀取出來的數據:
從圖中可以看出卡片中有五個扇區加密了,每個扇區是4個區塊。
第0個扇區(紅色框)的第一個區塊中的數據用於存放廠商代碼,已經固化,無法修改。
第0個扇區的中間的兩個數據塊沒有填寫數據
第0個扇區的最后一個數據塊是控制塊,其中前六個字節為密碼A,后六位為密碼B,中間四位為存取控制。
下面對存取控制的四位進行分析,因為所有區塊的存取控制位都使用了默認值 FF 07 80 69 ,所以就先分析吧。
十六進制: FF 07 80 69
換算成二進制:
1111 1111
0000 0111
1000 0000
0110 1001
根據下面的數據可得:
塊0 : C10 C20 C30
塊1 : C11 C21 C31
塊2 : C12 C22 C32
塊3 : C13 C23 C33
存取控制(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表示取反 )
則
|
|
C1X |
C2X |
C3X |
| X=0 |
0 |
0 |
0 |
| X=1 |
0 |
0 |
0 |
| X=2 |
0 |
0 |
0 |
| X=3 |
0 |
0 |
1 |
又按照存取控制:數據塊(塊0 、塊1、塊 2)的存取控制如下:
| 控制位( X=0.1.2 )
|
訪 問 條 件 (對數據塊 0 、1 、 2) |
||||||
| C1X |
C2X |
C3X |
Read |
Write |
Increment |
Decrement, transfer, Restore |
|
| 0 |
0 |
0 |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
|
| 0 |
1 |
0 |
KeyA|B |
Never |
Never |
Never |
|
| 1 |
0 |
0 |
KeyA|B |
KeyB |
Never |
Never |
|
| 1 |
1 |
0 |
KeyA|B |
KeyB |
KeyB |
KeyA|B |
|
| 0 |
0 |
1 |
KeyA|B |
Never |
Never |
KeyA|B |
|
| 0 |
1 |
1 |
KeyB |
KeyB |
Never |
Never |
|
| 1 |
0 |
1 |
KeyB |
Never |
Never |
Never |
|
| 1 |
1 |
1 |
Never |
Never |
Never |
Never |
|
(KeyA|B 表示密碼 A或密碼B ,Never表示任何條件下不能實現)
例如:當塊0的存取控制位 C10 C20 C30=1 0 0時,驗證密碼A或密碼 B正確后可讀;
驗證密碼B正確后可寫;不能進行加值、減值操作。
控制塊 塊3 的存取控制與數據塊(塊0、 1、2 )不同,它的存取控制如下:
|
|
|
|
密碼 A |
存取控制 |
密碼 B |
|||
| C13 |
C23 |
C33 |
Read |
Write |
Read |
Write |
Read |
Write |
| 0 |
0 |
0 |
N ever |
KeyA|B |
KeyA|B |
N ever |
KeyA|B |
KeyA|B |
| 0 |
1 |
0 |
N ever |
Never |
KeyA|B |
N ever |
KeyA|B |
N ever |
| 1 |
0 |
0 |
N ever |
KeyB |
KeyA|B |
N ever |
N ever |
KeyB |
| 1 |
1 |
0 |
N ever |
Never |
KeyA|B |
N ever |
N ever |
N ever |
| 0 |
0 |
1 |
N ever |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
| 0 |
1 |
1 |
N ever |
KeyB |
KeyA|B |
KeyB |
N ever |
KeyB |
| 1 |
0 |
1 |
N ever |
Never |
KeyA|B |
KeyB |
N ever |
N ever |
| 1 |
1 |
1 |
N ever |
Never |
KeyA|B |
Never |
Never |
Never |
例如:當塊3的存取控制位 C13 C23 C33=1 0 0時,表示:
密碼A:不可讀,驗證 KEYA或KEYB 正確后,可寫(更改)。
存取控制:驗證 KEYA或KEYB 正確后,可讀、可寫。
密碼B:驗證 KEYA或KEYB 正確后,可讀、可寫。
故此時:
| 區塊0 |
驗證密碼A或B后可讀、可寫、可加、可減、可存儲、可傳輸 |
| 區塊1 |
驗證密碼A或B后可讀、可寫、可加、可減、可存儲、可傳輸 |
| 區塊2 |
驗證密碼A或B后可讀、可寫、可加、可減、可存儲、可傳輸 |
| 區塊3 |
密碼A:永不可讀,當驗證密碼A或B時可寫 |
這些值都是卡的廠商設定的初始值,不知到學校為啥沒有修改。
接下來分析其他數據:
這是原卡的內容:
此時將飯卡(余額:31.36)復制了一份,然后用原飯卡消費N次后,原飯卡的余額變為1.71元,這個時候出問題了,因為我刷我復制的飯卡,余額任然是31.36元,所以判定飯卡的余額是存儲在飯卡上的。
此時再做一次對比,如下所示:
由上圖對比分析可以看出:
由上圖對比分析可以看出:
扇區0存了些卡片ID和廠商的代碼,具體是哪個公司或者哪個型號我就不關心了。0區塊存的是卡片的ID號(最前面的X1 X2 X3 X4 YY)<其實真正的ID只有4個字節,第五個字節DA是ID的校驗碼,校驗方法選的是相鄰兩個字節相互異或,即:X1 xor X2 xor X3 xor X4 = YY >,08應該是卡片的大小8Kbit,04 00 逆序后是00 04是卡片的類型,后面的數據是廠商自定義的數據。
扇區1存的是學校的相關信息,其中
0區塊存的是卡片的ID號(最前面的X1 X2 X3 X4 YY)
1區塊存的是學校后勤集團的名字,西大當然就是西大后勤集團了。
2區塊存的可能是后勤集團的負責人或者是當初辦理飯卡的負責人(主觀臆測滴,無可信度,個人覺得是辦理飯卡的辦理人,因為我測試了幾張不同年級的學生的卡片,當然也就是辦理時間不同了,結果這個名字都不相同,所以這個名字應該是后勤集團的辦理卡片的人的名字)
3區塊存的自然是密碼了,不知道或許是這部分信息無關重要,所以學校沒有修改這個扇區的B密碼和控制權限:FF 07 80 69
扇區2存的是個人信息:其中
0區塊存的是學生證號,X1 X2 32 01 02 00,此處采用的是逆序存儲法,將該數據倒過來就是00 02 01 32 X2 X1,我的學生證號為20132X2X1,剛好對應。(不知為何此處十六進制和十進制之間沒有轉換,直接將十進制的數據寫進來了,是為了方便?)
1區塊存的是名字,我的名字:“慎為之”,3個漢字,每個漢字占2個字節,共留個字節,后面的都為空格。(十六進制的20對應十進制的32,也就是空格的ASIIC碼值)。
2區塊存的是:"學生證20132X2X1" ,當然這是我的學生證號,別人的就是:"學生證$學生證號"
3區塊存的還是密碼,難道我們的個人信息也不重要?為啥重新設置訪問權限和B密碼,如果是這樣的話我就可以直接B密碼通過驗證然后進行操作了,食堂的漏洞?雖然食堂的服務器端有驗證措施,后面會講到,但這樣做終歸是不好的。
扇區3存的信息才是和Money相關的信息,想知道么?下面是分析:
0區塊前四個字節存的是金額,第一個字節存的是小數點后面的,第二、三、四個字節存的是小數點前面的,不進行十進制和十六進制的轉換,此處的36 31 00 00 表示余額為31.36元,第二幅圖中的71 01 00 00 表示1.71元。第4-7字節是消費次數,不論是充值或者是消費,每充值一次或者是消費一次,該值都會加一,采用逆序存儲。
后面的8-15字節存儲的是數據很難分析,一下是一些觀察到的規律:
1、存錢不對這些數據(后面8個字節)產生影響,所以這些位應該不是對數據的校驗,也就是說這部分數據和前八個字節沒有任何關系。
2、經對比分析,11和12字節(或許也包括13)是當天的消費金額。充值不對該數據產生影響,所以該數據應該只和消費有關。
3、第十五字節是十進制,代表年份,14表示2014年,第十四個字節表示是上次消費是今年的第多少天(目前值分析到該字節是16進制,且每天加一,在2014年6月4號當天我的飯卡上的該字節是0X94,轉換為十進制后是148,但當天應該是第155(31+28+31+30+31+4=155)天,相差7天,不知該處為何相差剛好一周的時間。)。充值不對該數據產生影響,所以該數據應該只和消費有關。
4、第九和第十個字節應該是連在一起的一個什么數據,在隨着消費增加也在增加,但是具體的關系還無法得到。充值不對該數據產生影響,所以該數據應該只和消費有關。另外該字節應該不是對余額或者消費次數(即前八個字節做校驗)。
5、最后一個字節不知道是什么數據,充值不對該數據產生影響,所以該數據應該只和消費有關。
1區塊不知存的什么數據,不過永遠都不變是真的,不管你消費了還是充值了都是那串數字,不同的人的飯卡有不同的序列。
2區塊存的數據和0相同
3區塊密碼
扇區4存的信息才是打水的信息:
0區塊未使用,還是初始的全零
1區塊存的是金額,是以沒四個字節分開,該處的金額是以分為單位,比如卡上有10塊錢的虛擬金額可以打水,那么0-3字節存的就是E8030000,換算成十進制就是1000,4-7字節存的是0-3字節數據取反,8-11存的還是0-3字節的內容,12-15字節存的數據是10 EF 10 EF,不知道是啥數據,也懶得分析,反正永遠不變。。
2區塊存的數據和1相同
3區塊密碼,不知道為何此處的密碼倒是設置的挺安全的,A密鑰和B密鑰都修改過了。
