Retrouvez l’identifiant de votre Pass’Région
Vous disposez d’une lecture brute de la mémoire d’une carte. Votre objectif n’est pas de tout comprendre immédiatement : vous allez accumuler des indices jusqu’à retrouver l’UID, l’identifiant unique de la puce, puis vérifier que vous ne vous êtes pas trompé.
Dossier d’enquête : identifier la puce d’un Pass’Région
Le PASS’Région jeunes est une carte de la Région Auvergne-Rhône-Alpes associée à différents services et avantages pour les jeunes. Selon les établissements et les usages, la carte peut également servir de support d’identification. Dans cette activité, nous n’allons pas chercher des informations personnelles : nous allons retrouver l’identifiant technique de la puce.
La carte sert de support à des usages numériques. Une partie des informations peut être gérée par des systèmes informatiques extérieurs à la carte.
Le support étudié ici utilise une puce RFID MIFARE Ultralight C. Elle possède un identifiant technique appelé UID.
Avec un smartphone Android équipé du NFC et une application de lecture compatible, on peut relever les zones lisibles de la puce et obtenir une copie brute des octets : un dump.
Travaillez avec votre propre Pass’Région… ou avec le relevé fourni
Vous pouvez coller le dump complet fourni par votre application NFC, ou seulement les 12 octets des pages 00, 01 et 02. Le didacticiel récupère automatiquement les premiers octets nécessaires à l’enquête. Exemple minimal : 04 00 66 EA 52 61 65 81 D7 48 FF 00.
Si vous n’avez pas votre carte ou si l’application n’affiche pas ces pages, utilisez le dump fourni dans le didacticiel.
Indice 1 : Lire le code hexadécimal
Mission : apprendre juste ce qu’il faut pour commencer à lire les valeurs du relevé.
Un dump est rempli de groupes de deux caractères comme 04, EA ou FF. Avant de pouvoir comprendre la mémoire, il faut donc savoir lire l’écriture utilisée pour représenter ses octets : l’hexadécimal.
Vous savez déjà compter en base 10 : après 9, il n’existe plus de nouveau chiffre, donc on ajoute une colonne et on écrit 10. En base 16, on dispose de 16 symboles avant d’ajouter une nouvelle colonne.
1A. Les 16 chiffres disponibles
Les dix premiers sont familiers. Pour les six suivants, on utilise des lettres.
1B. Compter jusqu’au changement de colonne
Faites avancer le compteur. Observez surtout le passage de 15 à 16.
En hexadécimal, quelle valeur décimale représente 0x10 ?
Indice 2 : Ouvrir un octet
Mission : comprendre ce que représente réellement un groupe de deux chiffres hexadécimaux.
Nous savons maintenant reconnaître les chiffres hexadécimaux, mais un groupe comme EA reste encore abstrait. Avant de lire le fichier du dump, il faut comprendre ce qu’est réellement un octet et pourquoi deux chiffres hexadécimaux suffisent pour l’écrire.
Un bit ne peut prendre que deux états : 0 ou 1. Un octet regroupe 8 bits. Il peut donc prendre 256 combinaisons différentes, de 0 à 255. Dans un octet, les positions n’ont pas toutes la même valeur : de gauche à droite, elles valent 128, 64, 32, 16, 8, 4, 2 et 1. Pour connaître la valeur décimale, on additionne simplement les valeurs placées sous les bits à 1.
Quelle valeur décimale correspond à FF ?
Indice 3 : Extraire les octets du relevé
Mission : distinguer les données de la carte des informations techniques qui les entourent dans le fichier.
Nous savons maintenant ce qu’est un octet et comment il peut s’écrire en hexadécimal. Nous pouvons donc revenir au fichier obtenu lors de la lecture du Pass’Région et distinguer les octets de la mémoire des indications ajoutées par le fichier pour les organiser.
Le fichier fourni par l’outil de lecture n’est pas une simple suite d’octets. Chaque ligne contient les données lues, mais aussi quelques indications qui précisent combien d’octets sont présents, où ils se placent et si la ligne paraît cohérente. Il n’est pas nécessaire de mémoriser ce format.
Indice 4 : Se repérer dans la mémoire
Mission : savoir retrouver une valeur grâce à sa page et à sa position.
Lire une valeur ne suffit pas : pour comprendre une mémoire, il faut aussi savoir où elle se trouve. Les adresses permettent de repérer chaque octet, puis les pages regroupent ces octets de façon pratique pour observer l’organisation de la puce.
Une adresse est simplement le numéro d’une case mémoire. Les adresses sont souvent écrites en hexadécimal avec le préfixe 0x. Dans cette mémoire, une page regroupe 4 octets.
Page 0 → adresses 0x00 · 0x01 · 0x02 · 0x03
Page 1 → adresses 0x04 · 0x05 · 0x06 · 0x07
On voit donc que chaque nouvelle page commence 4 adresses plus loin.
Pour retrouver la page d’une adresse, on peut convertir l’adresse en décimal puis la diviser par 4 : le quotient donne le numéro de page et le reste donne la position de l’octet dans cette page.
| Page | octet 0 | octet 1 | octet 2 | octet 3 | adresses |
|---|
Indice 5 : Repérer les zones qui attirent l’attention
Mission : parcourir rapidement le relevé et repérer les zones à examiner sans tirer de conclusion trop vite.
Maintenant que nous savons parcourir la mémoire, nous pouvons repérer rapidement les valeurs qui ressortent. Dans un relevé mémoire, on rencontre souvent des octets à 00. Les octets différents de zéro attirent l’œil, mais 00 est lui aussi une vraie valeur : il ne faut donc pas confondre « égal à zéro » et « inutile ».
Revenons maintenant au dossier actif. Il contient 176 octets. Certaines valeurs peuvent être 00. Cela ne veut pas dire que ces adresses n’existent pas : elles contiennent simplement la valeur zéro au moment de la lecture.
Peut-on conclure qu’un octet à 00 est « inutilisé » uniquement en regardant le dump ?
Indice 6 : Une donnée n’a pas de sens sans règle de décodage
Mission : comprendre pourquoi il faut connaître la convention avant d’interpréter une suite d’octets.
Nous avons repéré des octets non nuls, mais cela ne nous dit toujours pas ce qu’ils signifient. Une même suite de bits peut représenter un nombre, du texte, un identifiant ou autre chose. Cette étape sert donc à comprendre pourquoi il faut décoder et pourquoi plusieurs lectures peuvent être possibles.
Avant de chercher à donner un sens aux données, repérons précisément ce que nous sommes en train d’observer dans le dump.
Ces quatre octets : sont bien présents dans la mémoire, mais ils ne portent pas une étiquette disant « ceci est un nombre », « ceci est du texte » ou « ceci est une mesure ».
Pourquoi ne peut-on pas donner immédiatement un sens unique aux quatre octets observés ci-dessus ?
Résolution : Retrouvez puis vérifiez l’UID
Mission finale : reconstituer l’identifiant de la puce, puis vérifier son premier octet de contrôle avec un XOR.
Retrouver 7 octets qui ressemblent à un identifiant ne suffit pas : il faut disposer d’un indice supplémentaire montrant que nous avons correctement interprété le début de la mémoire. L’octet de contrôle de la page 00 va jouer ce rôle grâce à un calcul XOR.
Avant le calcul : le XOR en deux règles
Pour vérifier l’octet de contrôle, nous devons revenir aux bits. Le XOR, ou « OU exclusif », travaille colonne par colonne : deux bits identiques donnent 0 et deux bits différents donnent 1.
Vous avez retrouvé l’identifiant technique de la puce et vérifié que son premier octet de contrôle est cohérent avec les données observées.
UID : à retrouverBonus : Expérimenter sur une copie virtuelle
Après l’enquête : observer ce qui change dans le fichier lorsqu’on modifie un seul octet de la copie.
L’enquête sur l’UID est terminée. Cette dernière activité permet simplement d’expérimenter sans risque : lorsqu’un octet change dans une copie virtuelle, on peut observer les conséquences dans le fichier.
On travaille ici sur une copie virtuelle uniquement. Modifiez un des quatre octets de la zone test et observez ce qui change. Le badge ou le fichier d’origine ne sont jamais modifiés. Le fichier possède aussi son propre octet de vérification de ligne : il est recalculé automatiquement lorsque les données changent. Ce contrôle du fichier est différent de l’octet de contrôle de l’UID étudié pendant l’enquête.
Synthèse
8 bits. Une valeur de 0 à 255, souvent écrite avec deux chiffres hexadécimaux.
Position d’un octet dans la mémoire. Elle permet de retrouver précisément la donnée.
Regroupement de plusieurs octets. Ici : 4 octets par page.
Le sens des octets dépend du protocole, du type de donnée et du logiciel.