Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
mmiotic — Latence x-ray pour matériel non documenté | Kitploit
Outils/GitHubGitHub/xoreaxeaxeax/mmiotic
ReconnaissanceRétro-ingénierieCollecte d'InformationsHacking MatérielSécurité Matérielle
GitHubxoreaxeaxeax/mmiotic

mmiotic

Latence x-ray pour matériel non documenté

Voir le dépôt
141917il y a 1 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

mmiotic

Un outil exploratoire pour le timing MMIO — mesurez n'importe quelle adresse physique et disséquez le matériel à partir de la latence.

MMIO latency heatmap

Étonnamment utile pour la rétro-ingénierie matérielle, l'empreinte des hyperviseurs, l'analyse par canaux auxiliaires de l'activité des périphériques, la caractérisation de registres, le calibrage de déclencheurs malveillants et la fabrication d'instructions machine absurdement longues.

Exemples

Rétro-ingénierie des plages mémoire

Le premier mégaoctet de mémoire physique est un exemple facile pour commencer, même si sa structure est déjà bien connue.

first megabyte heatmap

Les limites de latence nous permettent de découper l'espace d'adressage sans nous fier aux dispositions rapportées.

  1. Commencez par un simple scan de latence : sudo ./mmiotic --start-address 0x0 --end-address 0x100000 --stride 4 --count 20 --quiet-mmap
  2. La latence se pose sur les limites classiques — DRAM jusqu'à 0x9FFFF à ~380 cy, puis le trou vidéo de 128 Ko, qui se divise en deux à 0xB0000. Le changement de variance à 0x20000 peut indiquer un parcours de page différent pour la page nulle.
  3. A0000–AFFFF : lent et instable (996 cy, écart-type 327), acheminé vers le Radeon sous tension mais inactif. B0000–BFFFF : rapide et rigide (780 cy, écart-type 3,2, lit ffffffff), revendiqué par personne. Des données d'apparence similaire, mais un écart de variance de 100x.
  4. C0000–FFFFF : /proc/iomem indique « System ROM », mais le scan montre une latence DRAM, pas une vitesse de flash — le BIOS est répliqué dans la DRAM.

Registres mailbox non documentés

Scannez l'espace de configuration du root complex (00:00.0, 4 Ko) pour détecter les valeurs aberrantes de latence par rapport à un plancher plat d'environ 675 cycles :

mailbox register heatmap

La latence de la boîte aux lettres est nettement supérieure aux données environnantes, et les pics dupliqués ainsi que les variances équivalentes permettent de faire correspondre des registres fonctionnellement similaires.

  1. Scannez l'espace de configuration du root complex : sudo ./mmiotic --start-address 0xf8000000 --end-address 0xf8001000 --stride 4 --count 200
  2. Deux dwords sont les valeurs aberrantes : l'offset 0xe4 (1218 cy, valeur 80e3110b) et 0xa4 (1199 cy, valeur deadbeef). e4 est un doorbell documenté ; a4 est non documenté.
  3. Latence quasi identique, à 0x40 d'écart, toutes deux bien au-dessus du plancher — une famille de registres atteignant la même cible hors puce, dont seul e4 est public.
  4. Les valeurs diffèrent : deadbeef se lit comme une sentinelle de non-initialisation/erreur — même boîte aux lettres, a4 non implémenté ou alimenté par une entrée invalide.

Calibrage d'interruptions

Des latences soigneusement sélectionnées peuvent parfois être utilisées dans des scénarios d'exploitation inhabituels (MCHAMMER, smiiiiiiiiiiiiiiii) :

interrupt calibration heatmap

Ici, un Radeon inactif et sans pilote transforme une lecture alignée de 4 octets en un blocage d'environ 100 000 cycles.

  1. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e00100 --stride 4 --count 50 — balayez la tête de la BAR GPU (0x90e00000, 256 Ko). 0x90e00008 coûte 110 152 cy ; 0x90e00018, 16 octets plus loin, est de nouveau rapide à 1 523 — par registre, pas par page.
  2. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e40000 --stride 4 --count 1 --binary — --binary sonde dans l'ordre inverse des bits, de sorte que l'ouverture complète de 256 Ko est uniformément couverte après 1 012 sondes, cartographiant un bloc contigu de 48 Ko où chaque registre est lent.
  3. Probablement, la latence est due à un aller-retour SMU pour débloquer un domaine dont l'horloge/l'alimentation est coupée — la carte de latence extrait donc la disposition d'alimentation du GPU, sans pilote ni fiche technique.

Coup d'œil mortel

Idéalement, lire une adresse physique serait une opération relativement sûre, mais mmiotic est particulièrement doué pour trouver accidentellement les exceptions :

killer peek heatmap

Par exemple, sur la plateforme ci-dessus, une lecture d'1 octet à 0xdc5003b0 — offset 0x3b0 d'une BAR de registres iGPU Zen 4 sans pilote (Région 5, 0xdc500000, 512 Ko) — réinitialise le système de manière fiable.

  1. sudo ./mmiotic --address 0xdc5003b0 --size 1 --count 1. Aucune sortie ; la machine redémarre.
  2. Exactement un dword : 0x3ac et 0x3b4 de part et d'autre lisent 00000000 à environ 3 200 cy et sont inoffensifs.
  3. Un balayage dword par dword de 0x3a0–0x3fc trouve 7 dwords empoisonnés entrelacés avec 17 dwords sûrs.
  4. sudo busybox devmem 0xdc5003b0 32 et sudo dd if=/dev/mem bs=1 count=1 skip=$((0xdc5003b0)) mettent la machine hors service si vous préférez vous passer de l'intermédiaire.

Utilisation

[!WARNING] Certaines plateformes se réinitialiseront lorsque des régions d'adresses spécifiques seront sondées par mmiotic. Soyez prudent quant à l'endroit où vous l'utilisez.

Ciblage

OptionNoms
-b/-d/-f/-rPCI --bus/--device/--function/--register — décodés par rapport à la base ECAM
-o, --offset <n>offset depuis la base MMIO (ignore le décodage B/D/F)
-A, --address <n>une adresse physique ; définit implicitement la base de la région
-a/-z--start-address/--end-address — une plage physique ; implique --scan

La base et la taille ECAM sont détectées automatiquement à partir de l'ACPI MCFG (/sys/firmware/acpi/tables/MCFG). Remplacez-les avec -M, --mmio-base / -Z, --mmio-size.

Scan

OptionEffet
-S, --scanparcourt toutes les adresses de la région cible
-t, --stride <n>pas entre les adresses (défaut : 4)
-n, --limit <n>s'arrête après ce nombre d'adresses
--binarysonde dans l'ordre inverse des bits — après k sondes, la plage a une couverture uniforme à une granularité d'environ range/k (voir l'avertissement ci-dessus)
-x, --limitedplage de registres limitée (0x00–0xff au lieu de 0x000–0xfff)
-e, --skipignore les fonctions qui lisent 0xffffffff à l'offset 0 (périphériques absents)
-I, --iomemscanne chaque région de premier niveau non–System-RAM dans /proc/iomem
-R, --ioregion <name>scanne les régions /proc/iomem dont l'étiquette correspond à <name>, à n'importe quelle profondeur

--find-target/--find-longest transforment le scan en recherche :

OptionEffet
-F, --find-target <s>trouve une adresse dont le temps d'accès atteint s secondes, puis augmente la largeur (4b non aligné → 8/16/32/64/512b) pour la pousser plus haut
-G, --find-longestmême recherche, mais épuise chaque candidat au lieu de s'arrêter au premier résultat
-B, --fallbacks <n>candidats conservés pour la phase d'escalade (défaut : 10)

Méthode d'accès

Télécharger l’outil