Our wallets are filling up with SIM and RFID cards that contain hidden information. using our latest project, the Bus Pirate universal serial interface, we can dump the memory from many common smart cards. In today’s How-to, we show you how to interface common smart cards, and walk you through the data stored on a FedEx Kinko’s prepaid value card.
Contexte
The FedEx Kinko’s prepaid card is actually a SLE4442 smart card. There’s nothing secret about the SLE4442, it’s completely documented in the datasheet (PDF), and you can buy blank cards on the web.
The card is openly readable, we’ll be able to look at the contents without any sort of malicious intrusion. It’s protected from writes by a three byte password, with a ‘three strikes you’re out’ policy that renders the card useless after three failed password attempts.
Due to its wide-spread use, in Kinko’s and other capacities, the SLE4442 has been the target of several high-profile hacks. At the ’06 Toorcon, [bunnie] and [Chris Tarnovsky] hosted a discussion on the card. [Chris] examined the silicon die and suggested that shorting a trace might defeat the security measures. You can see high-resolution images of the die on his site. [Strom Carlson] went right to the source and snooped the password with a logic analyzer, as documented in his famous ’06 Defcon presentation. The card even makes appearances in artwork.
We’re not planning on maliciously intruding on the card, but we can still look at the contents and demonstrate how to interface arbitrary protocols with our latest project, the Bus Pirate.
Connecting to the SLE4442
Épingler
Une fonction
Bus Pirate pin
1
+ 5Volts
+5volt supply
2
Réinitialiser
Aux
3
L’horloge
SCL
4
Data IO
SDA
5
NC
–
6
Sol
Sol
Grab the SLE4442 datasheet (PDF) if you haven’t already. The pinout is shown in the picture above. If you’re having trouble orienting the card, note that the large center pad connects to ground.
The card requires 5volts DC (datasheet page 27, table 3.2.2), we used the Bus Pirate’s handy 5volt supply. Interfacing at five volts is no problem because the Bus Pirate inputs are all 5volt tolerant.
A two-wire interface is used, with a clock line and bi-directional data line. We connected these to the Bus Pirate’s SDA and SCL pins. A third signal, reset, is required to initialize the chip; we used the Bus Pirate’s auxiliary output to control the reset line. The maximum clock frequency we can use to interface the device is 50kHz, with a 7kHz stated minimum (page 28, table 3.2.4:fCLK). The Bus Pirate’s raw 2 wire protocol runs at about 5kHz, but we didn’t have any problems interfacing the device.
The sle4442 has open collector outputs, and depends on pull-up resistors to hold the bus high. instead of switching the data pin between ground and 5volts, it switches between ground and high-impedance states. High-impedance means that the chip exerts no state on the line, it lets it float, like a microcontroller input pin.
Each of the signal lines need to be pulled-up to 5volts with a 2K-10K resistor, the value isn’t particularly important. Without the pull-up resistor, we’ll never see anything but 0 (ground) on the bus because the sle4442 doesn’t exert a voltage of it’s own. A benefit of this technique is that the Bus Pirate, which only switches at 3.3volts, will talk to the sle4442 at a full 5volts, in compliance with the 3.5volt minimum voltage for a high level (datasheet, page 27, table 3.2.3:Vih).
Initializing the card
Before we can read data from the card, we have to initialize it. This is done with a standard ISO 7816-3 answer to Reset (ATR) command. After initialization, we can read from the card using a simple two wire protocol.
Setup raw 2 wire mode
The interface shares some characteristics with I2C, but it’s not compatible. We used the Bus Pirate’s raw 2 wire bus mode to interface the device.
RAW2>m
1. SPI
2. I2C
3. UART
4. RAW 2 WIRE
5. RAW 3 WIRE
MODE>4 <– raw 2 wire bus mode
Ensemble de mode 900
...
SPEED>1 <– speed setting is ignored in current firmware
901 speed SET
1. High-Z outputs (H=input, L=GND)
2. normal outputs (H=Vcc, L=GND)
MODE>1 <– high impedance output type
9xx OUTPUT HIGHZ
402 RAW2WIRE READY, P FOR PULLUPS
RAW2>
The Bus Pirate has on-board pull-up resistors, but they only pull to 3.3volts. We must use external pull-ups to 5volts, as shown in the picture. High-Z output mode is compatible with the bus, normal outputs would put 3.3volts on the bus, potentially damaging something.
RAW2>l <–configure MSB/LSB 1. MSB d'abord 2. LSB d'abord MODE>2 <– LSB first 9xx LSB: least SIG bit FIRST RAW2>
The card reads and writes each byte least significant bit first (datasheet page 10). We use menu option L to set the data mode to LSB first.
Send 7816-3 ISO answer to reset command
ISO 7816-3 “answer to reset” is a standardized command used among many smart cards. The ATR sequence is shown above: reset is held high, one clock pulse is sent, reset is releaseré. Les 32 prochaines impulsions d’horloge (4 octets) lisent une en-tête ATR générique de la carte. L’en-tête contient des informations sur le type de carte et le protocole. Les lecteurs de cartes à puce multi-cartes utilisent ceci pour déterminer comment lire chaque carte.
RAW2> @ ^ Arrrr <- Aux High (Highz), Tick Horloge, Aux Bas, Lire 4 octets 952 AUX HAUT IMP, LIRE: 1 Ticks d'horloge 0xx Swaw2wire 0x01 950 AUX BAS 430 RAW2Wire Read: 0xa2 <-BEGIN ATR Header Bytes 430 Raw2Wire Read: 0x13 430 RAW2Wire Read: 0x10 430 RAW2Wire Read: 0x91 RAW2>
Nous émettons la commande @ ^ Arrrr au pirate de bus. @ met la broche auxiliaire en mode d’entrée haute impédance, la résistance de pull-up contient la réinitialisation à 5 Volts. ^ Problime une impulsion d’horloge, avec délai. A retourne la goupille auxiliaire pour produire et maintient la ligne de réinitialisation au sol.
r Problèmes 8 impulsions d’horloge et affiche les bits retournés sous forme d’octet. Ceci est un cas où le protocole est incompatible avec I2C. I2C comprend un bit d’accusé de réception supplémentaire entre chaque octet, les sorties SLE4442 32bits consécutivement.
Page 25 de la fiche technique explique l’en-tête ISO7816-3. Il est plus facile d’interpréter en binaire. Plutôt que de tout convertir en binaire, nous définissons le pirate de bus en mode écran binaire et publié une autre commande ATR.
RAW2> O <-SEUP Le mode de sortie 1. hexagone 2. Dec 3. bin 4. RAW Mode de sortie> 3 <-Show Nombres en binaire Set de mode de sortie 903 RAW2> @ ^ Arrrr <-Autro commande ATR 952 AUX HAUT IMP, LIRE: 1 4xx Raw2Wire 0B00000001 Horloge Ticks 950 AUX BAS 430 RAW2Wire Read: 0B10100010 <-0XA2 430 RAW2Wire Read: 0B00010011 <-0x13 430 RAW2Wire Read: 0B00010000 <-0x10 430 RAW2Wire Read: 0B10010001 <-0x91 RAW2>
Les 2 premiers octets sont des octets d’en-tête de protocole selon ISO 7816-3 (fiche technique 25).
L’octet 1 identifie le type de protocole.
0B10100010
7: 4 – Type de protocole (1010 = 2 fils)
3: 3 – RFU (0)
2: 0 – Identificateur de structure (010 = Général)
Byte 2, Paramètres de protocole, nous indique la carte si nous n’avions pas de datashe.
0b00010011
7: 7 – Prend en charge des longueurs de lecture aléatoires (0 = non, love to end)
6: 3 – Unités de données (0010 = 256Units)
2: 0 – Bits d’unité de données (011 = 8bits par unité)
Depuis l’en-tête, nous pouvons dire que le type de protocole est de 10, un bus à deux fils. La carte doit être lu jusqu’à la fin avant d’accepter une nouvelle commande. Il a 8 places à une unité et 256units; 256 octets de stockage total. Les deux octets finaux sont des données de 7814-4, qui semblent inintéressions (voir page 26).
Mémoire principale de vidage (256 octets)
Une fois la carte réinitialisée et que les octets ATR sont lus, nous pouvons envoyer des commandes à la carte. Les commandes sont trois octets longues; Ils commencent par une condition de départ de type I2C et se terminent par une condition d’arrêt de style I2C. Les conditions de démarrage et d’arrêt peuvent être générées manuellement avec \ – / \ \ and _ / – \, mais la bibliothèque de fil RAW 2 inclut également les raccourcis {et}. Les conditions de début et d’arrêt sont identiques à I2C, mais elles sont utilisées à un point différent de la transmission.
La commande de mémoire principale de lecture est 0x30, suivie d’une adresse de départ de lecture (0) et d’un troisième octet qui n’a pas d’importance (0xFF). Après la condition d’arrêt, la carte génère des données sur chaque horloge jusqu’à ce qu’il atteigne la fin de la mémoire. Comme décrit par l’en-tête ATR, aucune nouvelle commande ne peut être envoyée jusqu’à ce que la carte atteigne le dernier octet de la mémoire. À partir de l’adresse de lecture 0, il faut 256 * 8 impulsions d’horloge pour compléter le cycle de lecture.
RAW2> {0x30 0 0xFF} 0R255 0R10 <-Command 410 Etat de démarrage Raw2Wire (\ - / _ \) 420 RAW2WIRE Ecrire: 0x30 420 RAW2WIRE ÉCRIRE: 0x00 420 RAW2WIRE ÉCRIRE: 0x00 440 Etat d'arrêt RAW2WIRE (_ / - \) 431 RAW2Wire en vrac Lire, 0xFF Bytes: <-Bulk Lire 255 octets 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 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 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 0x00 0x00 431 Raw2wire en vrac Lire, 0x0a octets: <-Again pour obtenir le dernier octet (256) 0x00 0xFF 0xFF 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF RAW2>
{Nume la condition de début du bus. 0x30 Envoie l’adresse de lecture, 0 est l’octet de départ et 0xFF pourrait être n’importe quoi.} Envoie l’état d’arrêt de bus. 0R255 Horloges en octets de 255 8 bits et les affiche à l’écran. La carte a en fait 256 octets de mémoire principale. Nous publions donc une commande de lecture supplémentaire pour obtenir le dernier octet et vérifier que le bus revient à High après la lecture. Nous ne pouvons pas utiliser 0R256 car le pirate de bus ne comprend pas les nombres décimaux supérieurs à 255 (nous devrions résoudre ce problème).
Que signifie les données?
Nous avons disséqué la carte selon la fiche technique, la présentation de [Strom] ‘S Defcon, et ce guide pratique (PDF).
En-tête 32Byte …
0xa2 0x13 0x10 0x91