Une histoire vraie, un gadget à 30 €, une IA — et tout ce qui nous entoure.
A true story, a €30 gadget, an AI — and everything around us.
wanoo
Bruce / Flipper · reverse engineering
Le pitchThe pitch
Hacker, c'est comprendre. Comprendre, c'est améliorer. Sans limite.
Hacking is understanding. Understanding is improving. No limits.
L'histoire vraieA true story
« Hé… ce truc, y a moyen de le hacker ? Easy ? »
“Hey… this thing, can it be hacked? Easy?”
Un copain me fait découvrir son hobby : le ball-trap.
A buddy shows me his hobby: clay-pigeon shooting.
Le principe : une carte RFID qu'on scanne sur la télécommande → un jeton débloque 27 plateaux.
How it works: an RFID card scanned on the remote → a token unlocks 27 clays.
Cours de hack · 1Hacking 101 · 1
Par où entrer ? Le point de moindre résistance.
Where to get in? The path of least resistance.
La radioThe radio
la télécommande · sub-GHz ?the remote · sub-GHz?
La carteThe card
le déverrouillage · 13,56 MHzthe unlock · 13.56 MHz
resistance is futile — on attaque le maillon faible d'abord.hit the weakest link first.
Cas radio · la cibleRadio case · the target
Le ball-trap
The clay-trap
Contrôle motoriséMotorised control
Doc produit ouiProduct docs: yes
Doc technique : zéroTechnical docs: zero
illustration · la vraie a 8 boutons machine (A→H), un canal réglé par +/− et M/Aillustration · the real one has 8 machine buttons (A→H), channel set via +/− and M/A
C'est sans fil… mais quelle radio ?It's wireless… but which radio?
B.A.-BA radio · quelle fréquence ?Radio basics · which frequency?
antenne « quart d'onde » → longueur = λ/4 · donc λ = 4 × 17,25 cm = 0,69 m · les ondes : c = 300 000 km/s · f = c/λ = ≈ 433,92 MHz
quarter-wave antenna → length = λ/4 · so λ = 4 × 17.25 cm = 0.69 m · waves: c = 300,000 km/s · f = c/λ = ≈ 433.92 MHz
notice du récepteur · section « antenne » (reformulée)receiver manual · “antenna” section (paraphrased)Placer l'antenne en hauteur, jamais au fond d'une fosse. C'est un câble blindé 50 Ω, dénudé sur 20 cm au bout ; la partie blindée doit mesurer un multiple de 17,25 cm.Mount the antenna high, never at the bottom of a pit. It is a 50 Ω shielded cable, stripped for 20 cm at the end; the shielded part must be a multiple of 17.25 cm.
une phrase anodine de la notice — « multiple de 17,25 cm » — donne la fréquenceone harmless line in the manual — “multiple of 17.25 cm” — gives the frequency
L'outilThe tool
Le couteau suisse : Bruce, Flipper…
The Swiss army knife: Bruce, Flipper…
…ou n'importe quel outil d'analyse radio (SDR, RTL-SDR…).
…or any radio analysis tool (SDR, RTL-SDR…).
Flipper ZeroHackRF One · SDRM5Shark (CYD)
▍ÉcouterListen
▍RejouerReplay
▍Comprendre & bricolerUnderstand & tinker
~30 € · open-source · dans une poche~€30 · open-source · pocket-sized
Cours de hack · 2 · scannerHacking 101 · 2 · scan
Écouter, capturer… puis rejouer
Listen, capture… then replay
1
J'écoute le 433I listen on 433
pendant qu'il presse les boutons.while he presses the buttons.
4 PDF fournisseurs — aucun ne décrit le codage.4 vendor PDFs — none describes the encoding.
Reverse · onde → binaireReverse · wave → binary
Du signal aux bits
From signal to bits
4 captures réelles (S1…S4, même prise) · on échantillonne toutes les 585 µs (NRZ) : porteuse présente = 1, absente = 0 — pas encore de découpage, juste le signal brut → bits4 real captures (S1…S4, same button) · sampled every 585 µs (NRZ): carrier on = 1, off = 0 — no fields yet, just the raw signal → bits
Observer · variable vs figéObserve · variable vs fixed
Qu'est-ce qui change d'une trame à l'autre ?What changes from one frame to the next?
deux mêmes 24 trames, regroupées autrement · zones figées vs variables (cerclées)same 24 frames, grouped two ways · fixed vs variable zones (ringed)
▦ Par stand de tir (pièce)▦ By shooting stand (room)
▦ Par machine (prise)▦ By machine (button)
On ne sait pas encore ce que veut dire chaque zone — mais une logique apparaît : certaines ne bougent jamais, d'autres changent selon la pièce, d'autres selon la prise, une dernière à chaque trame.We don't yet know what each zone means — but a logic appears: some never move, some change with the room, some with the button, one on every frame.
Reverse · lire entre les lignesReverse · reading between the lines
Croiser la doc et les zones qui bougentCross the docs with the moving zones
La doc ne parle jamais de radio. Mais posée en face des zones variables, elle les nomme une à une — la doc est la pierre de Rosette.The docs never mention radio. But set against the variable zones, they name them one by one — the docs are the Rosetta stone.
canal 1channel 1machine 1machine 1
canal 2channel 2machine 1machine 1
canal 3channel 3machine 1machine 1
canal 4channel 4machine 1machine 1
la table des interrupteurs de la notice, redessinée — 5 DIP canal (32 canaux) + 3 DIP machine (8 machines) · la notice parle aussi d'un codethe manual's switch table, redrawn — 5 channel DIPs (32 channels) + 3 machine DIPs (8 machines) · the manual also mentions a code
1 · CanalChannel
Doc : 5 interrupteurs DIP → 2⁵ = 32 canaux · signal : zone de 5 bits, change par pièceDoc: 5 DIP switches → 2⁵ = 32 channels · signal: a 5-bit zone, changes per room
Doc §12 : « encodé avec votre N° de stand… identique partout » · signal : zone figéeDoc §12: “encoded with your stand number… identical everywhere” · signal: fixed zone
= 1 octet (favori), 0 ici · à confirmer= 1 byte (favourite), 0 here · to confirm
Reverse · les dernières zones variablesReverse · the last variable zones
Ce qui reste : le checksum… et le tail
What's left: the checksum… and the tail
Une somme de contrôle : le récepteur ré-additionne les octets et vérifie le total. Pour repérer une erreur de transmission — pas pour sécuriser.
A control sum: the receiver re-adds the bytes and checks the total. To catch a transmission error — not to secure.
Une image : « Bonjour, je m'appelle Lucas » — et il t'envoie le nombre de L comme checksum. Tu comptes… il manque un L. Donc tu as mal entendu : il s'appelait Yuka, avec un Y.Picture it: “Hi, I'm Lucas” — and he sends you the number of L's as a checksum. You count… one L is missing. So you misheard: his name was Yuka, with a Y.
0xAA = 10101010 en binaire. Un motif alterné, valeur de départ classique d'un checksum : non nul et distinctif, il attrape mieux les erreurs qu'un simple 0.
0xAA = 10101010 in binary. An alternating pattern, a classic checksum seed: non-zero and distinctive, it catches errors better than a plain 0.
LE TAIL · 4 bitsTHE TAIL · 4 bits
La toute dernière zone qui bouge — mais pas une donnée : une alternance qui repart du dernier bit du checksum (LSB 1 → 0101, 0 → 1010). Une horloge de fermeture.
The very last zone that moves — but not data: an alternation restarting from the checksum's last bit (LSB 1 → 0101, 0 → 1010). A closing clock.
Aucun secret → on le recalcule → on fabrique n'importe quelle commande.No secret → we recompute it → we forge any command.
Reverse · la trame décodéeReverse · the decoded frame
La trame, décodéeThe frame, decodedcapture s1 · machine A
On connaît la règle (la pierre de Rosette). On choisit une combinaison — même jamais capturée — et on calcule la trame.
We know the rule (the Rosetta stone). We pick a combo — even one never captured — and compute the frame.
canal · machine
1 · H
ch. 10000 · machine 10000000 · checksum 186
canal · machine · au hasardchannel · machine · random
17 · B
ch. 00000 · machine 00000010 · checksum 44
syncfixecanalmachinecodecktail
1 · H — canal 10000 · machine 10000000 · ck 186
17 · B — canal 00000 · machine 00000010 · ck 44 · jamais capturéenever captured
Grâce au reverse engineering : nos propres protocoles.Thanks to reverse engineering: our own protocols.
Reverse · le doubléReverse · the true pair
Un doublé ? Ça s'additionne.
A true pair? It adds up.
On lisait « une machine parmi huit ». C'est un masque de relais : un bit par lanceur — et les bits s'ajoutent dans la même trame.
We read "one machine out of eight". It is a relay mask: one bit per thrower — and the bits add up inside one frame.
syncfixecanalmachinecodecktail
lanceur Cthrower C
00000100 ck 62
+ lanceur Dthrower D
00001000 ck 66
= doublétrue pair
00001100 ck 70
la trame captée à la télécommandethe frame captured from the remote · canal et code inchangéschannel and code unchanged · seul le checksum bouge avec : 62 + 8 = 70only the checksum moves along: 62 + 8 = 70
Les deux plateaux partent au même instant. Rejouer un enregistrement ne sait pas faire ça.Both clays leave at the very same instant. Replaying a recording cannot do that.
Améliorer avec l'IA · le teaserImprove with AI · the teaser
Comprendre = construire mieux que l'original
Understand = build better than the original
6 boutons → une vraie appli.6 buttons → a real app.
16 serrures… et presque personne n'a changé la clé
16 locks… and almost nobody changed the key
Chaque secteur est fermé par une clé. Pour lire les données, il faut la clé. Alors comment Bruce les lit toutes ?
Each sector is locked by a key. To read the data, you need the key. So how does Bruce read them all?
1
La clé d'usineThe factory key
presque jamais changée. Bruce teste une liste de clés connues — plein de secteurs s'ouvrent d'un coup.almost never changed. Bruce tries a list of known keys — many sectors pop open at once.
2
Le verrou est casséThe lock is broken
crypto1 (1994) publié cassé en 2008. Connais une clé, et la carte te livre les autres toute seule.crypto1 (1994) published broken in 2008. Know one key, and the card hands you the rest by itself.
3
Bruce enchaîneBruce chains it
tout est automatique. La carte est vidée en quelques secondes, secteur par secteur.all automatic. The card is dumped in seconds, sector by sector.
La basculeThe twist
Rien de magique : la carte participe à sa propre ouverture. Une clé qu'on a laissée par défaut, derrière un verrou publié cassé il y a 16 ans.
Nothing magical: the card helps open itself. A key left at its default, behind a lock published broken 16 years ago.
Cas carte · notre journal de bordCard case · our field log
Trois attaques sur la carte du club
Three attacks on the club's card
La carte encaisse les deux premières. La troisième ne lui laisse aucune chance.
The card takes the first two. The third leaves it no chance.
1
Dictionnaire · mfocDictionary · mfoc
4549 clés connues testées → 0. Pas de clé d'usine : clé custom.4549 known keys tried → 0. No factory key: custom key.
2
Darkside · mfcukDarkside · mfcuk
casser la clé sur la carte seule, sans lecteur → bloqué (hasard non exploitable).crack the key from the card alone, no reader → blocked (nonce not exploitable).
3
Mfkey32 · le lecteurMfkey32 · the reader
on retourne la carte contre le lecteur → la clé custom tombe. La seule voie, et elle passe.turn the card against the reader → the custom key falls. The only way, and it works.
La solution ultimeThe ultimate solution
Clé changée, carte durcie : deux portes fermées. Mais tant qu'un lecteur doit s'authentifier, il y a une clé à capturer. Mfkey32 ne dépend d'aucune clé de départ — c'est l'attaque ultime contre MIFARE Classic.
Key changed, card hardened: two doors shut. But as long as a reader must authenticate, there's a key to capture. Mfkey32 needs no starting key — it's the ultimate attack on MIFARE Classic.
Cas carte · et si aucune clé ne marche ?Card case · what if no key works?
Mfkey32 : on retourne la carte contre le lecteur
Mfkey32: turn the card against the reader
Clé custom, dans aucun dictionnaire ? On n'ouvre aucun secteur… alors on change de camp.
A custom key, in no dictionary? We can't open a single sector… so we switch sides.
1
On devient la carteWe become the card
le gadget émule la carte et se présente au vrai lecteur (la télécommande du club).the gadget emulates the card and faces the real reader (the club's remote).
2
Le lecteur essaie SA cléThe reader tries ITS key
il veut ouvrir « sa » carte, donc il tente sa clé secrète sur nous. 2 essais suffisent.it wants to open 'its' card, so it tries its secret key on us. 2 tries are enough.
3
Crypto1 fuitCrypto1 leaks
son « hasard » est prévisible et sa réponse laisse filer quelques bits → on calcule la clé.its 'randomness' is predictable and its answer leaks a few bits → we compute the key.
Le twistThe twist
Le lecteur te confie son secret rien qu'en essayant de l'utiliser. Voilà ce qui rend la faille exécutable même avec zéro clé connue.
The reader hands you its secret just by trying to use it. That's what makes the flaw executable even with zero known key.
Cas carte · la véritéCard case · the truth
MIFARE Classic : Bruce & Flipper la lisent… et l'émulent
MIFARE Classic: Bruce & Flipper read it… and emulate it
1
ScannerScan
UID + structure en 1 seconde.UID + structure in 1 second.
2
ÉmulerEmulate
rejouer la carte depuis le gadget.replay the card from the gadget.
3
ClonerClone
l'écrire sur une carte vierge.write it to a blank card.
La douche froideThe cold shower
crypto1 cassé depuis 2008. Clés par défaut, UID recopiable. Pas plus sûr que la radio.
crypto1 broken since 2008. Default keys, copyable UID. No safer than the radio.
Cas carte · analyse comparéeCard case · compared reads
On compare les cartes — comme les signaux
We compare the cards — like the signals
Même méthode : on lit plusieurs cartes, on repère l'octet qui change = le compteur de jetons.
Same method: read several cards, spot the byte that changes = the token counter.
carte · 12 jetonscard · 12 tokenssect.1 bloc4 =sect.1 blk4 =0C 00 00 A7 1F 8C 4E …
carte · 3 jetonscard · 3 tokenssect.1 bloc4 =sect.1 blk4 =03 00 00 A7 1F 8C 4E …
carte · 0 jetoncard · 0 tokenssect.1 bloc4 =sect.1 blk4 =00 00 00 A7 1F 8C 4E …
Un seul octet bouge = le solde de jetons. On le réécrit → carte rechargée. (données d'exemple — vraies captures à venir)A single byte moves = the token balance. Rewrite it → recharged card. (placeholder data — real reads coming)
La vraie leçonThe real lesson
Ce cas de figure est partout.
This pattern is everywhere.
BluetoothWiFiAirTaglunettes MetaMeta glassesclés de voiturecar keysbadges
Nos vies numériques hurlent de la métadata sur nous.Our digital lives scream metadata about us.
Apprenons à écouter — et à comprendre — ce qui nous entoure.Let's learn to listen — and understand — what's around us.
Écouter ce qui nous entoureListening to what surrounds us
Un moniteur existe déjà :A monitor already exists:SquachWatch
Détecteur de surveillance open-source — sur le même « Cheap Yellow Display » que notre Bruce.Open-source surveillance detector — on the same “Cheap Yellow Display” as our Bruce.
scan en direct — TRACKER : 1 : un AirTag repérélive scan — TRACKER : 1: an AirTag spotted
l'écran du détecteurthe detector's screen
ce qu'il repère autour de toiwhat it spots around you