Retour à l’accueil
Information numérique · enquête

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é.

0 étape sur 8

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.

Une carte liée à des services

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.

Une puce sans contact

Le support étudié ici utilise une puce RFID MIFARE Ultralight C. Elle possède un identifiant technique appelé UID.

Un relevé accessible

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.

But de l’enquête. À la fin du parcours, vous devrez être capable de retrouver les 7 octets de l’UID dans les premières pages de mémoire et de vérifier une partie de cet identifiant grâce à un octet de contrôle.
Choisissez votre dossier

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.

Mon propre relevé
Relevé de secours

Si vous n’avez pas votre carte ou si l’application n’affiche pas ces pages, utilisez le dump fourni dans le didacticiel.

Dossier actif : dump exemple. L’identifiant est encore inconnu : à vous de le retrouver.
Organisation de l’activité : dès que vous chargez votre propre relevé, tout le parcours se met à jour avec ses valeurs : premières pages, lignes du fichier, tableau mémoire, zones non nulles, exemple de décodage et calcul de vérification. Avec seulement 12 octets, les activités s’adaptent aux trois pages disponibles.
Première pièce à conviction : voici les 12 premiers octets du dossier actif, organisés comme ils apparaissent dans les pages 00, 01 et 02 de la mémoire. À ce stade, ils semblent encore incompréhensibles.
Pour commencer l’enquête, il faut apprendre à lire l’écriture utilisée pour représenter ces valeurs : l’hexadécimal.

Indice 1 : Lire le code hexadécimal

Mission : apprendre juste ce qu’il faut pour commencer à lire les valeurs du relevé.

Pourquoi cet indice est-il nécessaire ?

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.

Idée essentielle. L’hexadécimal n’est pas une nouvelle sorte de nombre : c’est seulement une autre manière d’écrire la même valeur, comme 1 m = 100 cm représente la même longueur.

Pourquoi utiliser l’hexadécimal ?

Un ordinateur manipule des bits, mais une longue suite de 0 et de 1 devient vite difficile à lire. L’hexadécimal est surtout une écriture compacte du binaire : un groupe de 4 bits correspond exactement à un chiffre hexadécimal, donc un octet de 8 bits tient en seulement 2 caractères.

Binaire
1110 1010
8 bits
→
Hexadécimal
EA
2 caractères
Intérêt pratique : dans un dump contenant des dizaines ou des centaines d’octets, l’hexadécimal permet de voir immédiatement les limites de chaque octet, de gagner de la place et de réduire les erreurs de lecture. Il ne complique pas la donnée : il la rend plus compacte pour l’être humain.

1A. Les 16 chiffres disponibles

Les dix premiers sont familiers. Pour les six suivants, on utilise des lettres.

Cliquez sur un symbole pour voir sa valeur décimale.

1B. Compter jusqu’au changement de colonne

Faites avancer le compteur. Observez surtout le passage de 15 à 16.

0
0 en décimal
En base 16 : 0, 1, 2… 9, A, B, C, D, E, F, puis 10.

1C. Pourquoi 26 s’écrit 1A ?

On cherche combien il y a de paquets de 16, puis ce qu’il reste. C’est exactement le même principe que dizaines + unités en base 10.

26
=
1 × 16 + 10
→
1 A
1paquet de 16
10reste
Asymbole de 10
26
décimal
0x1A
hexadécimal
À retenir : les deux caractères 0x placés devant un nombre constituent un préfixe : ils indiquent au lecteur que ce qui suit est écrit en hexadécimal (base 16). Le 0x ne fait pas partie de la valeur. Ainsi 0x10 signifie « 10 en hexadécimal » et vaut 16 en décimal, et 0xFF signifie « FF en hexadécimal ».

1D. Convertisseur guidé

Choisissez une valeur décimale entre 0 et 255. L’outil effectue la division par 16 et montre les deux chiffres hexadécimaux obtenus.

En hexadécimal, quelle valeur décimale représente 0x10 ?

Indice acquis : vous savez maintenant reconnaître et lire les valeurs hexadécimales du relevé.

Indice 2 : Ouvrir un octet

Mission : comprendre ce que représente réellement un groupe de deux chiffres hexadécimaux.

Pourquoi cet indice est-il nécessaire ?

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.

Exemple. 0000 1010 possède les bits de valeur 8 et 2 à 1 : 8 + 2 = 10. En hexadécimal, 10 s’écrit A, donc cet octet s’écrit 0A. Deux chiffres hexadécimaux représentent exactement un octet.

Inspecteur d’octet

Activez ou désactivez les bits :

00000000binaire
0décimal
00hexadécimal
Regroupez les 8 bits en deux paquets de 4 : chaque paquet correspond à un chiffre hexadécimal. Les nombres affichés sous les bits indiquent leur valeur décimale.

Quelle valeur décimale correspond à FF ?

Indice acquis : vous savez maintenant qu’un octet contient 8 bits et que deux chiffres hexadécimaux suffisent à l’écrire.

Indice 3 : Extraire les octets du relevé

Mission : distinguer les données de la carte des informations techniques qui les entourent dans le fichier.

Pourquoi cet indice est-il nécessaire ?

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.

Repère. Nous venons de voir qu’un octet s’écrit avec deux chiffres hexadécimaux. Ainsi 04, EA ou FF correspondent chacun à un octet.

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.

Décoder la première ligne

Cliquez successivement sur les zones. Ne cherchez pas à mémoriser le format : observez comment une ligne transporte à la fois des données et leur adresse.

:
À vous. Cliquez sur un morceau de la ligne pour découvrir son rôle.

Vérification rapide

Dans la ligne affichée ci-dessus, le premier champ indique le nombre d’octets de données. Cliquez sur ce champ : l’explication vous donne sa valeur décimale. L’objectif n’est pas de mémoriser le format du fichier, mais de savoir distinguer les octets de la mémoire des informations qui les accompagnent.

Indice acquis : vous savez maintenant isoler les véritables octets de mémoire dans une ligne du fichier.

Indice 4 : Se repérer dans la mémoire

Mission : savoir retrouver une valeur grâce à sa page et à sa position.

Pourquoi cet indice est-il nécessaire ?

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.

Regardons les deux premières pages.
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.

Octet différent de 00
Pageoctet 0octet 1octet 2octet 3adresses
Cliquez sur un octet.
–page
–position dans la page
–adresse
–valeur

Retrouver une adresse

L’adresse 0x05 correspond à 5 en décimal. Une page contient 4 octets : 5 = 1 × 4 + 1. À vous d’en déduire la page et la position dans cette page.

Indice acquis : vous savez maintenant localiser un octet dans une page de mémoire.

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.

Pourquoi cet indice est-il nécessaire ?

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.

Carte de densité

Chaque case représente une page de 4 octets. Les petits segments orange sont les octets non nuls.

Cliquez sur une page pour voir combien d’octets y sont non nuls.
176octets présents
–octets non nuls
–du dump non nul
À retenir. Une zone pleine de 00 reste une vraie zone mémoire. Pour savoir si elle est libre, réservée ou interprétée, il faut connaître la convention du système.

Peut-on conclure qu’un octet à 00 est « inutilisé » uniquement en regardant le dump ?

Indice acquis : vous savez maintenant parcourir le relevé et repérer les zones à examiner.

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.

Pourquoi cet indice est-il nécessaire ?

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.

Gardez le début du relevé sous les yeux

Les premières pages seront utiles pour résoudre l’enquête, mais ne cherchez pas encore à sélectionner l’UID : la dernière étape vous donnera la règle permettant de le reconstituer.

UID signifie Unique Identifier, c’est-à-dire identifiant unique. Il identifie la puce lors des échanges NFC ; ce n’est ni le nom de l’élève ni un numéro écrit sur la carte.

Pour constater qu’une autre zone de mémoire peut être interprétée de plusieurs façons, nous allons prendre quatre octets du dossier actif : :, situés dans une page du relevé. Ils ne servent ici que de matériau d’exercice.

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 ».

Ce que vous devez faire : choisissez successivement plusieurs façons de regarder exactement les mêmes quatre octets. Ne cherchez pas encore à comprendre les calculs utilisés : constatez seulement qu’avec les mêmes octets, plusieurs décodages sont possibles. C’est précisément pour cela qu’un programme doit connaître la convention utilisée pour savoir ce que les données veulent dire.

Mêmes octets, lectures différentes

À retenir : la mémoire ne change pas. C’est seulement la façon de décoder les octets qui change. Pour savoir quelle lecture est correcte, il faut connaître la règle choisie par le système qui a enregistré ces données.
Pourquoi faut-il décoder ? Une mémoire ne stocke finalement que des bits, regroupés ici en octets. Pour transformer ces octets en une information compréhensible : nombre, texte, date, identifiant, mesure… : un programme doit savoir comment ils ont été codés. Sans cette convention, plusieurs interprétations restent possibles.

Pourquoi ne peut-on pas donner immédiatement un sens unique aux quatre octets observés ci-dessus ?

Indice acquis : vous savez maintenant qu’une suite d’octets ne peut être interprétée correctement qu’avec la bonne convention.

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.

Pourquoi vérifier l’identifiant ?

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.

1. Reconstituez l’identifiant de la puce

Voici les trois premières pages du dossier actif. Elles contiennent l’UID mais aussi des octets techniques. Pour une MIFARE Ultralight C à UID 7 octets, la règle utile à l’enquête est la suivante :

Règle de lecture. L’UID est formé des 3 premiers octets de la page 00, suivis des 4 octets de la page 01. Le 4e octet de la page 00 est un octet de contrôle : il ne fait pas partie de l’UID.
Identité numérique retrouvée :

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.

0 XOR 0 = 0identiques
0 XOR 1 = 1différents
1 XOR 0 = 1différents
1 XOR 1 = 0identiques

2. Vérifiez le premier octet de contrôle

Vous venez d’identifier les trois premiers octets de l’UID. Juste après eux, à la fin de la page 00, se trouve un octet de contrôle. Dans le dossier actif, cet octet vaut EA.

D’où vient 0x88 ? Un UID de 7 octets est transmis en plusieurs parties lors de l’échange NFC. Pour signaler que l’identifiant continue, le protocole utilise temporairement la valeur 0x88. Elle n’est pas stockée dans la page : elle est ajoutée pendant l’échange. Le nom technique « Cascade Tag » n’est pas à retenir.

Pour vérifier la première partie de l’UID, on calcule : 0x88 XOR les trois premiers octets de l’UID. Si le relevé correspond bien à la structure attendue, le résultat doit être égal à l’octet de contrôle observé en fin de page 00.

À vous de calculer. Pour chaque colonne de bits, appliquez la règle du XOR : bits identiques → 0 ; bits différents → 1. Validez chaque résultat intermédiaire avant de passer au suivant.

1. Premier calcul : 0x88 XOR 0x04

10001000
XOR00000100
=

2. Deuxième calcul : résultat précédent XOR 0x00

10001100
XOR00000000
=

3. Troisième calcul : résultat précédent XOR 0x66

10001100
XOR01100110
=

4. Décoder le résultat final en hexadécimal

Le résultat binaire obtenu est séparé en deux groupes de 4 bits. Pour chacun, utilisez le tableau de correspondance ci-dessous afin de retrouver le chiffre hexadécimal associé.

HexaBinaireHexaBinaire
0000081000
1000191001
20010A1010
30011B1011
40100C1100
50101D1101
60110E1110
70111F1111
Méthode : un groupe de 4 bits correspond exactement à un chiffre hexadécimal. Cherchez donc séparément 1110, puis 1010.
1110
=
+
1010
=
résultat final : ?
Enquête résolue

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 : à retrouver
Ce que montre le calcul. L’octet de contrôle n’est pas choisi au hasard : on l’observe dans la mémoire puis on vérifie qu’il peut être recalculé à partir des octets auxquels il est associé. Une donnée de contrôle sert à détecter une incohérence ou une erreur dans les données reçues.
Enquête terminée : vous avez reconstitué l’UID et utilisé un contrôle binaire pour vérifier le début de l’identifiant.

Bonus : 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.

Pourquoi ce bonus ?

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.

Zone test : copie virtuelle

4 octets d’une page mémoire du dossier actif.

Conséquences visibles

Adresse modifiée
aucune
Octet de donnée: → :
Octet de vérification de la ligne: → :
Ligne du fichier : avant / après
Avant
Après
octet de donnée modifiéoctet de vérification recalculé

Synthèse

Octet

8 bits. Une valeur de 0 à 255, souvent écrite avec deux chiffres hexadécimaux.

Adresse

Position d’un octet dans la mémoire. Elle permet de retrouver précisément la donnée.

Page

Regroupement de plusieurs octets. Ici : 4 octets par page.

Interprétation

Le sens des octets dépend du protocole, du type de donnée et du logiciel.

Mini-bilan

1. Combien d’octets contient une page de ce dump ?

2. Combien de bits contient un octet ?

3. Valeur décimale de FF ?

4. Qu’est-ce qui indique où se trouve un octet en mémoire ?

5. Que signifie le préfixe 0x ?

6. Pourquoi une suite d’octets peut-elle avoir plusieurs interprétations ?

7. Pourquoi utilise-t-on souvent l’hexadécimal pour afficher une mémoire ?

Score : :