從NFC卡分析看ACR122U讀寫原理 (轉載)

Victor__Zhang發表於2020-12-10

本文轉載介紹一個NFC卡製作的全部流程,並對製作過程中的讀寫原理進行探討。在逆向分析中,我們會接觸多種多樣的工具,在使用工具的同時,希望大家思考一下原理,便於更深入的進行了解和學習。


目錄:
 

         0x1.工具及卡片介紹

        0x2.卡片資訊讀取

        0x3.卡片資料分析及修改

        0x4.卡片資訊寫入

接下來步入正題,先從背景介紹開始。之前購得ACR122U之後閒置了一段時間,最近辦理了一張餐飲消費會員卡,於是忍不住拿來分析一下。

0x1.工具及卡片介紹

先說一下會員卡,該卡片是M1卡。所謂的M1晶片,是指菲利浦下屬子公司恩智浦出品的晶片縮寫,全稱為NXP Mifare1系列,常用的有S50及S70兩種型號,截止到2013年11月4日,已經有國產晶片與其相容,利用PVC封裝M1晶片、感應天線,然後壓制成型後而製作的卡即是智慧卡行業所說的M1卡。

 


工具是讀寫器硬體裝置ACR122U以及配套的用於讀寫的PC軟體。    ACR122U NFC讀寫器是一款基於13.56 MHz非接觸(RFID)技術開發出來的連機非接觸式智慧卡讀寫器。它符合ISO/IEC18092近場通訊(NFC)標準,支援Mifare®卡、ISO 14443 A類和B類卡、以及全部四種NFC標籤。
 


為了確定該讀寫器的主晶片,將其拆解,確認讀寫的主晶片為NXP(恩智浦)的PN532:
 


0x2.卡片資訊讀取
    0x2.1  卡片資訊讀取

該裝置的提供的讀取程式為M1卡服務程式:


 

電腦安裝驅動以後,連線讀卡器,卡片靠近讀卡器,選擇讀卡器後,點選開始破解,即可等待破解完成。完成後我們就可以拿到M1卡的二進位制檔案資訊,副檔名為dump,大小為1KB。下圖為讀取到的dump檔案及分析結果標註:


我們先了解一下M1卡的儲存結構,M1卡分為16個扇區,每個扇區由4塊(塊0、塊1、塊2、塊3)組成,儲存結構如圖所示:
 


其中第0扇區用於儲存卡片的UID資訊以及廠商寫入的資訊,一般不需要我們分析修改;

每個扇區的塊0、塊1、塊2為資料塊,可以用於儲存資料;

塊3位控制塊,由密碼A、存取控制(控制字)、密碼B組成,且每個扇區的密碼和存取控制都是獨立的,即 每個扇區都有自己的密碼。


 

FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
//     密碼A      |   存取控制    |    密碼B

接下來我們看一下我們讀取到的資料,將dump檔案使用十六進位制編輯器開啟
 


第0扇區我們暫不理會,顯然,資料基本儲存在第10扇區與第11扇區,且兩個扇區的控制塊是相同的,後續我們著重分析這兩個扇區。


    0x2.2  PN532讀寫過程


對於PN532而言,讀取過程又是怎樣的呢?我們先來了解一下PN532。

         PN532由NXP出品,是一款高度整合的載波的13.56MHz傳輸模組,基於80C51核心有40KROM、1KRAM。 使用不同的韌體支援13.56MHz頻段的無線協議。

這裡我們介紹一下ACR122U對M1卡的讀寫卡流程:


 

// 【初學者僅作了解】
  
//  1.喚醒PN532
 PC->PN532: 55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00
 PN532->PC: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
//  喚醒的資料包頭為固定格式
  
//  2.獲取卡UID
PC->PN532: 00 00 FF 04 FC D4 4A 02 00 E0 00
  
//   析:
//   04 -> 代表有四個資料分別是 D4 4A 02 00
//   FC -> 這是04的補碼 
//   4A -> 命令
//   02 -> 卡數量,0--2
//   00 -> 波特率 106K
//   E0 -> 校驗位  D4+4A+02+00=0x0120  取後兩位20的補碼為E0
  
 PN532->PC:  00 00 FF 00 FF 00 
                       00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 86 7D C9 56 06 00 
  
//    析:
//    00 00 FF 00 FF 00  -> ACK
//    00 00 FF 0C F4 
//    D5                -> PN532 到 MCU
//    4B                -> 響應命令
//    01                 -> 目標卡1
//    01                 -> 目標卡數量,最大為0x02,最小為0
//    00 04            -> ATQ
//    08                 -> 卡容量 08=1K
//    04                 -> 4個位元組UID
//    86 7D C9 56 -> UID
//    06 00            -> DCS+POST
  
//  3.祕鑰驗證
  
PC->PN532:  00 00 FF 0F F1 D4 40 01 60 07 FF FF FF FF FF FF 86 7D C9 56 C2 00
  
//     析:
//     40   -> 命令
//     01   -> 卡1
//     60   -> 金鑰驗證命令
//     07   -> 塊號
//     FF FF FF FF FF FF -> 金鑰
//     86 7D C9 56   -> UID 
//     C2   -> 檢驗位
  
 PN532->PC: 00 00 FF 00 FF 00 
                      00 00 FF 03 FD D5 41 00 EA 00 
//    析: 41 00   -> 正確狀態
  
//  4.開始讀卡
  
PC->PN532: 00 00 FF 05 FB D4 40 01 30 06 B5 00 //讀第6塊
PC->PN532: 00 00 FF 05 FB D4 40 01 30 07 B4 00 //讀第7塊
PC->PN532: 00 00 FF 05 FB D4 40 01 30 08 B3 00 //讀第8塊 
//     析:   
//     40   -> 命令
//     01   -> 卡1
//     30   -> 讀卡命令
//     06   -> 塊號
        
PN532->PC: 00 00 FF 00 FF 00      //ACK
                     00 00 FF 13 ED D5 41 00 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 01 00  //7塊
  
PN532->PC: 00 00 FF 00 FF 00 //ACK
                     00 00 FF 13 ED D5 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EA 00     //6塊
  
//        析:
//        41 00   -> 正確
//        41 03   -> 錯誤
  
//  5.寫卡操作
PC->PN532: 00 00 ff 15 EB D4 40 01 A0 06 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F CD 00
  
//     析:
//     40   -> 命令
//     01   -> 卡1
//     A0   -> 寫卡命令
//     06   -> 塊號
//     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F    -> 16位元組資料
//     CD  -> 校驗和
  
PN532->PC: 00 00 00 FF 00 FF 00 
                     00 00 FF 03 FD D5 41 00 EA 00
//        析:
//        41 00   -> 正確


PN532讀寫過程均已經介紹,卡片資訊寫入時僅介紹操作,不再贅述原理。

0x3.卡片資料分析及修改

分析過程我們需要取多組資料,進行分析來確認不同資料所代表的的意義,此處我們僅分析第10及第11兩個扇區。

 


根據上圖內容,我們可以看到,10扇區的塊0沒有資料,10扇區塊2和11扇區塊0相同,11扇區的塊1和塊2相同,所以我們僅僅分析10扇區塊1,11扇區塊0和塊1。接下來我們對比不同餘額時對應的資料:

//  餘額319.4
  
#  扇區10塊1
01 00 01 00 00 05 FD 20 05 04 00 00 6D B7 00 51
#  扇區11塊0及塊1
17 10 30 00 00 00 00 00 00 00 00 00 00 00 00 57
00 00 00 26 00 00 7C C4 FF FF 83 3B 00 00 00 22
  
//  餘額298.6
  
#  扇區10塊1
01 00 01 00 00 05 FD 20 05 04 00 00 6D B7 00 51
#  扇區11塊0及塊1
17 10 30 00 00 00 00 00 00 00 00 00 00 00 00 57
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23

根據資料結果,我們可以看出,在消費後,只有11扇區塊1(塊2相同)發生了變化。

其中餘額319.4及298.6,以分為單位是31940和29860,轉化為十六進位制為 0x7CC4和0x74A4,恰好可以與11扇區中塊1中的資料對應。
 
//  餘額298.6
  
#  扇區11塊1
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23
  
#  27和23為計數,每消費一次增加1
#  00 00 74 A4 為餘額資料
#  FF FF 8B 5B 為餘額校驗資料,為餘額取反

我們繼續看下扇區10塊1

//  餘額298.6
  
#  扇區10塊1
01 00 01 00 00 05 FD 20 05 04 00 00 6D B7 00 51
  
#卡片上印刷的卡號為28087,對應十六進位制為0x6DB7,恰好與扇區10塊1對應

 


至此資料基本分析完畢,我們來嘗試寫入看結果如何。

0x4.卡片資訊寫入

我們把餘額改為600,也就是60000分,十六進位制為0xEA60,取反為0x159F,修改如下:

 
//  餘額298.6修改為600
  
#  扇區11塊1,修改前
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23
  
#  扇區11塊1,修改前
00 00 00 27 00 00 EA 60 FF FF 15 9F 00 00 00 23

 


修改後儲存dump檔案,使用MiFare Card Programming工具將其寫入到卡中


需要注意的是,每個扇區需要有本身對應的密碼才可以寫入。

 


【補充】

寫入更改後的餘額後,測試可正常消費,為避免因卡號記錄追溯到使用者資訊,可以更改卡號資訊,即扇區10塊1中的6DB7可以更改,更改後需要同時更改塊1的末尾資料,因為末尾的資料51為校驗位,是塊1的前15位資料取和後獲得的值,請大家根據情況自行理解分析,此處不作贅述。

感覺RFID的技術硬體原理講述的還是挺詳細,方便理解各種卡。目前類似的卡的金額等只儲存使用者名稱,餘額都在他們PC裡面。

本文只在於技術分享研究!乾飯了,打工人!

相關文章