Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
mmiotic — Latenz-Röntgen für undokumentierte Hardware | Kitploit
Tools/GitHubGitHub/xoreaxeaxeax/mmiotic
AufklärungReverse EngineeringInformationsbeschaffungHardware-HackingHardware-Sicherheit
GitHubxoreaxeaxeax/mmiotic

mmiotic

Latenz-Röntgen für undokumentierte Hardware

Repository anzeigen
1339vor 10 TagenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

mmiotic

Ein exploratives Werkzeug für MMIO-Timing — miss die Latenz einer beliebigen physischen Adresse und zerlege die Hardware anhand der Latenz.

MMIO latency heatmap

Unerwartet nützlich für Hardware-Reverse-Engineering, Hypervisor-Fingerprinting, Side-Channeling von Geräteaktivitäten, Registercharakterisierung, Kalibrierung bösartiger Auslöser und das Erzeugen obszön langer Maschinenbefehle.

Beispiele

Reverse Engineering von Speicherbereichen

Das erste Megabyte des physischen Speichers ist ein einfaches Beispiel für den Einstieg, auch wenn seine Struktur bereits gut bekannt ist.

first megabyte heatmap

Die Latenzgrenzen erlauben es uns, den Adressraum zu unterteilen, ohne uns auf gemeldete Layouts zu verlassen.

  1. Beginne mit einem einfachen Latenz-Scan: sudo ./mmiotic --start-address 0x0 --end-address 0x100000 --stride 4 --count 20 --quiet-mmap
  2. Die Latenz landet auf den klassischen Grenzen — DRAM bis 0x9FFFF bei ~380 cy, dann das 128-KB-Video-Loch, das sich bei 0xB0000 in zwei Teile teilt. Die Änderung der Varianz bei 0x20000 könnte auf einen anderen Page Walk für die Null-Seite hindeuten.
  3. A0000–AFFFF: langsam und zittrig (996 cy, stdev 327), zum stromversorgten, aber im Leerlauf befindlichen Radeon geleitet. B0000–BFFFF: schnell und starr (780 cy, stdev 3.2, liest ffffffff), von niemandem beansprucht. Ähnlich aussehende Daten, aber eine 100-fache Varianzlücke.
  4. C0000–FFFFF: /proc/iomem sagt „System ROM“, aber der Scan zeigt DRAM-Latenz, nicht Flash-Geschwindigkeit — das BIOS wird in den DRAM gespiegelt.

Undokumentierte Mailbox-Register

Scanne einen Root-Complex-Konfigurationsraum (00:00.0, 4 KB) nach Latenz-Ausreißern gegenüber einem flachen Boden von ~675 Zyklen:

mailbox register heatmap

Die Mailbox-Latenz ist deutlich höher als die umgebenden Daten, und die doppelten Spitzen und gleichwertigen Varianzen ermöglichen es uns, funktional ähnliche Register zuzuordnen.

  1. Scanne den Root-Complex-Konfigurationsraum: sudo ./mmiotic --start-address 0xf8000000 --end-address 0xf8001000 --stride 4 --count 200
  2. Zwei Dwords sind die Ausreißer: Offset 0xe4 (1218 cy, Wert 80e3110b) und 0xa4 (1199 cy, Wert deadbeef). e4 ist eine dokumentierte Doorbell; a4 ist undokumentiert.
  3. Nahezu identische Latenz, 0x40 voneinander entfernt, beide weit über dem Boden — eine Registerfamilie, die dasselbe Off-Die-Ziel erreicht, von der nur e4 öffentlich ist.
  4. Die Werte unterscheiden sich: deadbeef liest sich wie ein Sentinel für „nicht initialisiert/Fehler“ — gleiche Mailbox, a4 nicht implementiert oder mit ungültiger Eingabe gefüttert.

Interrupt-Kalibrierung

Sorgfältig ausgewählte Latenzen können manchmal in ungewöhnlichen Exploit-Szenarien eingesetzt werden (MCHAMMER, smiiiiiiiiiiiiiiii):

interrupt calibration heatmap

Hier verwandelt ein im Leerlauf befindlicher, treiberloser Radeon einen einzelnen ausgerichteten 4-Byte-Read in einen Stillstand von ~100.000 Zyklen.

  1. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e00100 --stride 4 --count 50 — überstreiche den Kopf der GPU-BAR (0x90e00000, 256 KB). 0x90e00008 kostet 110.152 cy; 0x90e00018, 16 Bytes weiter, ist mit 1.523 wieder schnell — pro Register, nicht pro Seite.
  2. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e40000 --stride 4 --count 1 --binary — --binary testet in Bitumkehr-Reihenfolge, sodass die gesamte 256-KB-Apertur nach 1.012 Sondierungen gleichmäßig abgedeckt ist und ein zusammenhängender 48-KB-Block kartiert wird, in dem jedes Register langsam ist.
  3. Wahrscheinlich ist die Latenz auf einen SMU-Roundtrip zurückzuführen, um eine Clock-/Power-gated-Domäne zu entsperren — die Latenzkarte extrahiert also das Stromversorgungslayout der GPU, ohne Treiber oder Datenblatt.

Killer-Peek

Idealerweise wäre das Lesen einer physischen Adresse ein relativ sicherer Vorgang, aber mmiotic ist besonders gut darin, versehentlich die Ausnahmen zu finden:

killer peek heatmap

Zum Beispiel setzt auf der obigen Plattform ein 1-Byte-Read von 0xdc5003b0 — Offset 0x3b0 einer treiberlosen Zen-4-iGPU-Register-BAR (Region 5, 0xdc500000, 512 KB) — das System zuverlässig zurück.

  1. sudo ./mmiotic --address 0xdc5003b0 --size 1 --count 1. Keine Ausgabe; die Kiste startet neu.
  2. Genau ein Dword: 0x3ac und 0x3b4 auf beiden Seiten lesen 00000000 bei ~3.200 cy und sind harmlos.
  3. Ein Dword-für-Dword-Sweep von 0x3a0–0x3fc findet 7 schädliche Dwords, die mit 17 sicheren verschachtelt sind.
  4. sudo busybox devmem 0xdc5003b0 32 und sudo dd if=/dev/mem bs=1 count=1 skip=$((0xdc5003b0)) bringen die Kiste zu Fall, wenn du den Mittelsmann lieber überspringst.

Verwendung

[!WARNING] Einige Plattformen setzen zurück, wenn bestimmte Adressbereiche von mmiotic untersucht werden. Sei vorsichtig, wo du dies einsetzt.

Zielauswahl

Die ECAM-Basis und -Größe werden automatisch aus ACPI MCFG erkannt (/sys/firmware/acpi/tables/MCFG). Überschreibe sie mit -M, --mmio-base / -Z, --mmio-size.

Scannen

--find-target/--find-longest verwandeln das Scannen in eine Suche:

OptionEffekt
-F, --find-target <s>finde eine Adresse, deren Zugriffszeit s Sekunden erreicht, und steigere dann die Breite (unausgerichtetes 4b → 8/16/32/64/512b), um sie weiter zu erhöhen

Zugriffsmethode

Ausgabe / Ausführung

Ergebniszeilen

root@kitploit:~
b/d/f.o.l: 00:02:00.00.4  address: 00000000f0100000  min:      312  max:      480  stdev:      2.1  dynamic: 0  value: 8086abcd

-T versieht die Zykluszahlen mit dem Suffix cy und fügt ein skaliertes Min/Max-Zeitpaar ein (-N gibt diese als rohe Nanosekunden aus):

root@kitploit:~
b/d/f.o.l: 00:02:00.00.4  address: 00000000f0100000  min:      312 cy  max:      480 cy  (   104 ns/   160 ns)  stdev:      2.1  dynamic: 0  value: 8086abcd

Einrichtung

Kompilieren:

root@kitploit:~
make

Wird als Root ausgeführt, um Zugriff auf /dev/mem zu erhalten.

Wenn du Folgendes siehst: mmap ... Operation not permitted, versuche, mit iomem=relaxed zu booten, um CONFIG_STRICT_DEVMEM aufzuheben:

root@kitploit:~
# /etc/default/grub
GRUB_CMDLINE_LINUX="iomem=relaxed nopat"

Führe dann sudo update-grub aus und starte neu.

Praxiseinsatz

mmiotic wurde verwendet, um eine Vielzahl interner und externer Forschung voranzutreiben, manchmal auf unerwartete Weise. Einige Beispiele für mmiotic-Anwendungen:

  • MCHAMMER: mmiotic kalibriert eine verzögerte Machine-Check-Exception für die präzise Zustellung von MC#-Signalen in geschützte Umgebungen.

  • smiiiiiiiiiiiiiiii: mmiotic ermittelt die Hochlatenz-Instruktion, um das SMM-Rendezvous zu brechen.

  • The Assembly Hall of Shame: mmiotic wird ausgiebig für das wichtige Problem der Performance-Deoptimierung eingesetzt.

Autor

mmiotic ist ein Forschungsprojekt von Christopher Domas (@xoreaxeaxeax).

Tool herunterladen
OptionNamen
-b/-d/-f/-rPCI --bus/--device/--function/--register — gegen die ECAM-Basis dekodiert
-o, --offset <n>Offset von der MMIO-Basis (überspringt die B/D/F-Dekodierung)
-A, --address <n>eine physische Adresse; setzt die Regionsbasis implizit
-a/-z--start-address/--end-address — ein physischer Bereich; impliziert --scan
OptionEffekt
-S, --scanalle Adressen in der Zielregion durchlaufen
-t, --stride <n>Schritt zwischen Adressen (Standard: 4)
-n, --limit <n>nach dieser Anzahl von Adressen anhalten
--binaryin Bitumkehr-Reihenfolge prüfen — nach k Prüfungen hat der Bereich eine gleichmäßige Abdeckung mit ~range/k-Granularität (siehe Warnung oben)
-x, --limitedeingeschränkter Registerbereich (0x00–0xff statt 0x000–0xfff)
-e, --skipFunktionen überspringen, die bei Offset 0 0xffffffff lesen (nicht vorhandene Geräte)
-I, --iomemjeden Top-Level-Bereich in /proc/iomem scannen, der kein System-RAM ist
-R, --ioregion <name>/proc/iomem-Bereiche scannen, deren Bezeichnung auf <name> passt, in jeder Tiefe
-G, --find-longest
gleiche Suche, aber jeden Kandidaten ausschöpfen, statt beim ersten Treffer abzubrechen
-B, --fallbacks <n>Kandidaten, die in die Eskalationsphase übernommen werden (Standard: 10)
OptionEffekt
-s, --size <n>Bytes pro Zugriff: 1 / 2 / 4 (Standard) / 8 / 16 (XMM) / 32 (YMM) / 64 (ZMM) / 512 (fxrstor). Größen > 4 liegen außerhalb der Spezifikation, funktionieren aber auf getesteter Hardware; AVX-Breiten benötigen AVX / AVX-512F
-c, --count <n>Stichproben pro Adresse (Standard: 1); das Minimum wird gemeldet
-L, --lockmesse ein gesperrtes RMW: lock xadd (Größen 1/2/4/8) oder lock cmpxchg16b (Größe 16). Schreibt den Wert zurück
-g, --gathermesse einen vektorisierten Gather; --size 16/32/64 wählt XMM/YMM/ZMM (AVX-512)
-w, --write-readerfasse die Schreib-Latenz, indem ein Read getimed wird, der einen zuvor geposteten Write beobachten muss — siehe unten
-E, --enter (--enter-2, --enter-3)treibe einen Burst von bis zu 30 Zugriffen aus einem einzigen enter $0, $31 — siehe unten
-k, --continuebei einem fxrstor-Fehler diese Stichprobe verwerfen und mit dem Scannen fortfahren
OptionEffekt
-C, --min-cycles <n>nur Ergebnisse mit min_cycles >= n ausgeben
-T, --timeNanosekunden neben Zyklen anzeigen (erkennt die TSC-Frequenz)
-N, --nanosecondmit --time rohe Nanosekunden ausgeben, ohne Einheiten-Skalierung
-P, --progressLive-Scan-Fortschritt auf stderr
-p, --processor <n>an logische CPU n binden (Standard: 0) — reduziert Timer-Rauschen
-u, --unboundnicht an einen Kern binden
--lazy-mmap2-GB-Fenster bei Bedarf mappen; erforderlich für Bereiche > 2 GB
--quiet-mmap„mmap failed“-Rauschen von unzugänglichen Bereichen unterdrücken
FeldBedeutung
b/d/f.o.lBus/Gerät/Funktion, Register-Offset, Zugriffsgröße
offsetOffset von der MMIO-Basis — ersetzt b/d/f.o.l, wenn das Ziel von -o/-A/-a+-z stammt
addressvollständige 64-Bit-physische Adresse
min/maxschnellster und langsamster gesehener Zugriff, in Zyklen
stdevStandardabweichung der gemessenen Zykluszahlen
dynamic1, wenn sich der Wert zu irgendeinem Zeitpunkt über die Stichproben hinweg geändert hat
valuegelesener Wert — bei Größen über 8 Byte die ersten 32 Byte als leerzeichengetrennte Qwords
faultsnur angehängt, wenn ein Zugriff einen Fehler auslöste