什麼是數碼產品?羅曼·皮克勒 Digital Electronics HOW-TO:閱讀FedEx Kinko的智能卡(SLE4442)

HOW-TO:閱讀FedEx Kinko的智能卡(SLE4442)

我們的錢包正在填充包含隱藏信息的SIM和RFID卡。使用我們最新的項目,總線海盜通用串行接口,我們可以從許多常見的智能卡中拋棄內存。在今天的方法中,我們向您展示如何接口普通智能卡,並通過存儲在FedEx Kinko的預付費卡上的數據來攜帶數據。

背景

FedEx Kinko的預付卡實際上是一個ST4442智能卡。 SLE4442沒有什麼秘密,它完全記錄在數據表(PDF)中,您可以在網上購買空白卡。

該卡是公開可讀的,我們將能夠查看沒有任何惡意入侵的內容。它受到三個字節密碼的保護,有一個“三次罷工”策略,在三次失敗的密碼嘗試後呈現卡無用。

由於其廣泛使用,在Kinko等容量中,SLE4442一直是幾個高調的黑客攻擊的目標。在’06 Toorcon,[Bunnie]和[Chris Tarnovsky]舉辦了一張討論。 [Chris]檢查了矽模具,並建議縮短痕跡可能會破壞安全措施。您可以在他的網站上看到死亡的高分辨率圖像。 [Strom Carlson]向源代碼右轉,並使用邏輯分析儀窺探密碼,如他著名的“06 Defcon演示文稿”所示。卡甚至在藝術品中出現。

我們沒有計劃在卡片上惡意侵入,但我們仍然可以查看內容並演示如何用我們的最新項目,總線海盜界面接口任意協議。

連接到SLE4442

別針
功能
巴士海盜別針

1
+ 5Volts.
+ 5伏電源

2
重置
奧克斯

3.

SCL.

4.
數據IO.
SDA.

5.
N / C.

6.
地面
地面

如果您還沒有,請抓住SLE4442數據表(PDF)。引腳放電顯示在上面的圖中。如果您遇到了缺陷,請注意,大型中心墊連接到地。

該卡需要5Volts DC(數據表第27頁,表3.2.2),我們使用了總線海盜的5Volt電源。在五個伏特的接口沒有問題,因為總線海盜輸入都是5抗體。

使用雙線接口,具有時鐘線和雙向數據線。我們將這些連接到總線海盜的SDA和SCL引腳。第三個信號重置需要初始化芯片;我們使用總線海盜的輔助輸出來控制重置線。我們可以用於接口的最大時鐘頻率為50kHz,最小值為7kHz(第28頁,表3.2.4:FCLK)。總線海盜的原始2線協議在大約5kHz上運行,但我們沒有任何問題接口設備。

SLE4442具有開放的收集器輸出,並取決於上拉電阻以保持總線高。它不是在地和5Volt之間切換數據引腳,而是在地面和高阻抗狀態之間切換。高阻抗意味著芯片在線路上沒有狀態,它可以像微控制器輸入引腳一樣浮動。

使用2k-10k電阻需要將每個信號線拉到5 volt,該值並不是特別重要的。如果沒有上拉電阻,我們將永遠不會在總線上看到0(接地),因為SLE4442不施加它的電壓。這種技術的好處是,僅在3.3 volts的總線海盜將與SLE4442交談,以滿足高級的3.5Volt最小電壓(數據表,表3.2.3 :vih)。

初始化卡

在我們可以從卡中讀取數據之前,我們必須初始化它。這是使用標準ISO 7816-3答案來重置(ATR)命令完成的。初始化後,我們可以使用簡單的兩種線路協議從卡中讀取。

設置原始2線模式

界面與I2C共享一些特徵,但它不兼容。我們使用總線海盜的原始2線總線模式接口設備。

Raw2> M.
1. SPI.
2. I2C.
3. UART.
4.原始2線
5.原始3線
模式> 4 < - 原始2線總線模式 900模式集 ...... 速度> 1 < - 速度設置在當前固件中忽略 901速度集 1.高Z輸出(H =輸入,L = GND) 2.正常輸出(H = VCC,L = GND) 模式> 1 < - 高阻抗輸出類型 9xx輸出uplz. 402 Raw2wire準備好,p用於上拉 Raw2>

總線海盜有車載上拉電阻,但它們只拉到3.3 volts。我們必須使用外部上拉到5Volts,如圖所示。高Z輸出模式與總線兼容,正常輸出將放置3.3Volts,潛在地損壞某些東西。

RAW2> L <-CONFIGURE MSB / LSB 1. MSB First. 2. LSB First. MODE> 2 < - LSB首先 9xx lsb:最小sig bit Raw2>

卡讀取並寫出每個字節最低有效位(數據表第10頁)。我們使用菜單選項l首先將數據模式設置為LSB。

發送7816-3 ISO答案重置命令

ISO 7816-3“回答重置”是許多智能卡中使用的標準化命令。 ATR序列如上所示:復位保持高,發送一個時鐘脈衝,重置為釋放天。接下來的32個時鐘脈衝(4個字節)從卡中讀取通用ATR標題。標題包含有關卡類型和協議的信息。多卡智能卡讀卡器使用此方法來確定如何閱讀每張卡。

RAW2> @ ^ ARRRR < - AUX HIGH(HIGHZ),時鐘勾選,輔助低,讀取4個字節 952 AUX高IMP,閱讀:1 4xx RAW2WIRE 0x01時鐘滴答 950 AUX LOW. 430 RAW2WIRE讀取:0xA2 <-begin ATR標頭字節 430 Raw2Wire閱讀:0x13 430 Raw2Wire閱讀:0x10 430 Raw2Wire閱讀:0x91 Raw2>

我們向公共汽車海盜發出命令@ ^ arrrr。 @將輔助引腳放在高阻抗輸入模式下,上拉電阻保持5Volts的複位。 ^發出一個時鐘脈衝,延遲。 A返回輔助引腳以輸出並在接地處保持復位線。

R發出8個時鐘脈衝,並將返回的位作為字節顯示。這是協議與I2C不兼容的一個實例。 I2C包括每個字節之間的附加確認位,SLE4442連續輸出32bits。

數據表的第25頁解釋了ISO7816-3標題。它最容易在二進制中解釋。我們不是將所有內容轉換為二進制,我們將總線海盜設置為二進制顯示模式並發出另一個ATR命令。

RAW2> O <-SETUP輸出模式 十六進制 2. 12月 3.箱子 生根 輸出模式>二進制中的3 <-show數字 903輸出模式集 Raw2> @ ^ arrrr <-Another ATR命令 952 AUX高IMP,閱讀:1 4xx RAW2WIRE 0B00000001時鐘滴答 950 AUX LOW. 430 RAW2WIRE閱讀:0B10100010 <-0xa2 430 RAW2WIRE閱讀:0B00010011 <-0x13 430 RAW2WIRE閱讀:0B00010000 <-0x10 430 RAW2WIRE閱讀:0B10010001 <-0x91 Raw2>

前2個字節是ISO 7816-3(Datasheet Page 25)的協議標題字節。

字節1識別協議類型。

0B10100010.
7:4 – 協議類型(1010 = 2線)
3:3 – RFU(0)
2:0 – 結構標識符(010 =一般)

字節2,協議參數,如果我們沒有數據表,請告訴我們該卡。

0B00010011
7:7 – 支持隨機讀取長度(0 = NO,讀取結束)
6:3 – 數據單元(0010 = 256個)
2:0 – 數據單元位(011 =每單位8位)

從標題中,我們可以告訴協議類型為10,兩個線總線。在接受新命令之前,必須將卡一直讀取到末尾。它有8位的單元,256個; 256bytes總存儲。最終的兩個字節是7814-4數據,似乎無趣(見Datasheet第26頁)。

轉儲主內存(256字節)

重置卡並讀取ATR字節後,我們可以將命令發送到卡。命令長度為三個字節;它們從I2C式啟動條件開始,並以I2C式停止條件結束。可以使用\ – / _ \和_ / – \手動生成啟動和停止條件,但原始2線庫還包括快捷方式{和}。開始和停止條件與I2C相同,但它們在傳輸中的不同點處使用。

讀取的主存儲器命令是0x30,後跟讀取開始地址(0),以及無關緊要的三個字節(0xff)。在停止條件之後,卡在每個時鐘輸出數據,直到它到達存儲器的結尾。如ATR標題所描述的,直到卡到達存儲的最後一個字節之前,可以發送任何新命令。從讀地址0開始,需要256 * 8個時鐘脈衝來完成讀取周期。

RAW2> {0x30 0 0xFF} 0R255 0R10 <-Command 410 RAW2WIRE開始條件(\ - / _ \) 420 Raw2Wire寫:0x30 420 Raw2Wire寫:0x00 420 Raw2Wire寫:0x00 440 Raw2Wire停止條件(_ / - \) 431 Raw2Wire批量讀取,0xFF字節:<-bulk讀取255個字節 0xA2 0x13 0x10 0x91 0x46 0xff 0x81 0x15 0xff 0x01 0x4b 0x03 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xd2 0x76 0x00 0x00 0x04 0x09 0xff 0xff 0xff 0xff 0xff 0xff 0x7b 0x14 0xae 0x47 0xe1 0x7a 0x94 0x3f 0x4c 0x46 0xc6 0x3b 0x00 0x00 0x00 0x00 0x20 0x08 0x03 0x04 0x09 0x ** 0x ** 0x ** 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x30 0x31 0x3 * 0x3 * 0x30 0x30 0x31 0x33 0x3 * 0x3 * 0x3 * 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x43 0x61 0x73 0x68 0x20 0x43 0x75 0x73 0x74 0x6f 0x6d 0x65 0x72 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x39 0x39 0x31 0x31 0x00 0x31 0x30 0x31 0x00 0x30 0x30 0x30 0x30 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x20 0x08 0x03 0x04 0x09 0x ** 0x ** 0x ** 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0x00 431 Raw2wire批量讀取,0x0a字節:<-Again獲取最後一個字節(256) 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff Raw2>

{發出總線啟動條件。 0x30發送讀取地址,0是起始字節,0xFF可能是任何東西。} sends the bus stop condition. 0r255 clocks in 255 8bit bytes and displays them on the screen. The card actually has 256 bytes of main memory, so we issue an additional read command to get the last byte and verify that the bus returns to high after the read is over. We can’t use 0r256 because the Bus Pirate doesn’t understand decimal numbers greater than 255 (we should address that).

What does the data mean?

We dissected the card according the datasheet, [Strom]’s Defcon presentation, and this handy guide (PDF).

32byte Header…

0xA2 0x13 0x10 0x91 <–The first four bytes are a repeat of the ATR data 0x46 0xFF 0x81 0x15<–manufacturer tags, other junk 0xFF 0x01 0x4B 0x03 0x00 <–ICCF, IC card fabricator id 0xFF 0xFF 0xFF 0xFF <–ICCN, IC serial number, 0 0xFF 0xFF 0xFF 0xFF<– misc tags and lengths, 0 0xD2 0x76 0x00 0x00 0x04 0x09 <–application identifier (Kinko’s?) 0xFF 0xFF 0xFF 0xFF 0xFF <–all other bytes 0 The first 32 bytes are a permanently burned header with serial numbers, manufacturer codes, and other unique data (datasheet page 24). This header prevents exact duplication of cards, even if you have a blank card and a security code. Kinko’s didn’t have a custom serial number permanently burned into each card. Now data…. 0x7B 0x14 0xAE 0x47 0xE1 0x7A 0x94 0x3F <– IEEE-754 value, $0.02 This is the value stored on the card, in IEEE-754 format. You can use this utility to make it readable. 0x3f947ae147ae147b=$0.02. …8 bytes of junk… 0x20 <– 0x20 after copy, 0x00 after computer time 0x08 0x03 0x04 0x09 0x** 0x** 0x**<–date/time purchased This is the date and time the card was purchased, 2008 March 4, 9:**:**.**. Some digits have been obscured to protect the anonymity of our supplier. …40 bytes of junk… 0x30 0x31 0x3* 0x3* <–Store number: 01** 0x30 0x30 0x31 0x33 0x3* 0x3* 0x3* <– SN: 0013*** The card serial number consists of the store number and a unique, seven digit number. Some digits obscured. …more bytes… 0x08 0x03 0x04 0x09 0x** 0x** 0x** <– another time …more bytes… 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00<– last 8 bytes on the card 0xFF 0xFF… <-not real data bytes Dump protection memory (4 bytes) The first 32 bytes of the data memory can be write protected. Each bit of the four byte data protection register (command 0x34) represents a byte of data memory. A bit set to 1 cannot be overwritten. We can read the data protection register and find out which bytes of the main memory are write protected. This is easiest to understand in binary, so we did this operation in binary output mode. RAW2>{0x34 0 0} 0r4 <–command 410 RAW2WIRE開始條件(\ - / _ \) 420 RAW2WIRE WRITE: 0b00110100 420 RAW2WIRE WRITE: 0b00000000 420 RAW2WIRE WRITE: 0b00000000 440 Raw2Wire停止條件(_ / - \) 431 RAW2WIRE bulk READ, 0b00000100 BYTES: 0b00100000 0b11100001 0b00011111 0b11111000 <–data protection register Raw2>

Each bit corresponds with one of the first 32 bytes of the card memory. If the bit is one, the corresponding byte is write protected. This register can be written, but only if you have the correct password.

Dump security memory (4 bytes)

The security memory contains a password verification attempt counter, and the three byte password. We can read the read the security memory without the password, but the password bytes will read as 0. The security memory address is 0x31.

RAW2>{0x31 0 0} 0r4 <–command 410 RAW2WIRE開始條件(\ - / _ \) 420 RAW2WIRE WRITE: 0b00110001 420 RAW2WIRE WRITE: 0b00000000 420 RAW2WIRE WRITE: 0b00000000 440 Raw2Wire停止條件(_ / - \) 431 RAW2WIRE bulk READ, 0b00000100 BYTES: 0b00000100 0b00000000 0b00000000 0b00000000<–bytes Raw2>

The attempt counter starts at three (0b00000111), and counts down to 0. When the counter reads 0, the card is essentially destroyed. We used two access attempts to test the password commands, this card has one try left.

Takin

Leave a Reply

Your email address will not be published. Required fields are marked *