M1卡分析


工具:ACR122UMifare 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 12 )不同,它的存取控制如下:

  

 

 

 

密碼 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:不可讀,驗證 KEYAKEYB 正確后,可寫(更改)。

         存取控制:驗證 KEYAKEYB 正確后,可讀、可寫。

           密碼B:驗證 KEYAKEYB 正確后,可讀、可寫。



 故此時:

區塊0

驗證密碼AB后可讀、可寫、可加、可減、可存儲、可傳輸

區塊1

驗證密碼AB后可讀、可寫、可加、可減、可存儲、可傳輸

區塊2

驗證密碼AB后可讀、可寫、可加、可減、可存儲、可傳輸

區塊3

密碼A:永不可讀,當驗證密碼AB時可寫
密碼B:當驗證密碼AB時可讀可寫
存取控制:當驗證密碼AB時可讀可寫。


這些值都是卡的廠商設定的初始值,不知到學校為啥沒有修改。




接下來分析其他數據:

這是原卡的內容:

此時將飯卡(余額:31.36)復制了一份,然后用原飯卡消費N次后,原飯卡的余額變為1.71元,這個時候出問題了,因為我刷我復制的飯卡,余額任然是31.36元,所以判定飯卡的余額是存儲在飯卡上的。

此時再做一次對比,如下所示:



由上圖對比分析可以看出:

由上圖對比分析可以看出:

扇區0存了些卡片ID和廠商的代碼,具體是哪個公司或者哪個型號我就不關心了。0區塊存的是卡片的ID號(最前面的X1 X2 X3 X4 YY<其實真正的ID只有4個字節,第五個字節DAID的校驗碼,校驗方法選的是相鄰兩個字節相互異或,即:X1 xor X2 xor X3 xor X4 = YY >08應該是卡片的大小8Kbit04 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、經對比分析,1112字節(或許也包括13)是當天的消費金額。充值不對該數據產生影響,所以該數據應該只和消費有關。

3、第十五字節是十進制,代表年份,14表示2014年,第十四個字節表示是上次消費是今年的第多少天(目前值分析到該字節是16進制,且每天加一,在201464號當天我的飯卡上的該字節是0X94,轉換為十進制后是148,但當天應該是第15531+28+31+30+31+4=155)天,相差7天,不知該處為何相差剛好一周的時間。)。充值不對該數據產生影響,所以該數據應該只和消費有關。

4、第九和第十個字節應該是連在一起的一個什么數據,在隨着消費增加也在增加,但是具體的關系還無法得到。充值不對該數據產生影響,所以該數據應該只和消費有關。另外該字節應該不是對余額或者消費次數(即前八個字節做校驗)。

5、最后一個字節不知道是什么數據,充值不對該數據產生影響,所以該數據應該只和消費有關。

1區塊不知存的什么數據,不過永遠都不變是真的,不管你消費了還是充值了都是那串數字,不同的人的飯卡有不同的序列。

2區塊存的數據和0相同

3區塊密碼

扇區4存的信息才是打水的信息:

0區塊未使用,還是初始的全零

1區塊存的是金額,是以沒四個字節分開,該處的金額是以分為單位,比如卡上有10塊錢的虛擬金額可以打水,那么0-3字節存的就是E8030000,換算成十進制就是10004-7字節存的是0-3字節數據取反,8-11存的還是0-3字節的內容,12-15字節存的數據是10 EF 10 EF,不知道是啥數據,也懶得分析,反正永遠不變。。

2區塊存的數據和1相同

3區塊密碼,不知道為何此處的密碼倒是設置的挺安全的,A密鑰和B密鑰都修改過了。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM