Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
mmiotic — Raggi X della latenza per hardware non documentato | Kitploit
Strumenti/GitHubGitHub/xoreaxeaxeax/mmiotic
RicognizioneReverse EngineeringRaccolta InformazioniHacking HardwareSicurezza Hardware
GitHubxoreaxeaxeax/mmiotic

mmiotic

Raggi X della latenza per hardware non documentato

Vedi Repository
141971 mese faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

mmiotic

Uno strumento esplorativo per il timing di MMIO — cronometra qualsiasi indirizzo fisico e disseziona l' hardware dalla latenza.

Mappa di calore della latenza MMIO

Sorprendentemente utile per il reverse engineering dell'hardware, il fingerprinting degli hypervisor, l'analisi dell'attività dei dispositivi tramite canali laterali, la caratterizzazione dei registri, la calibrazione di trigger malevoli e la creazione di istruzioni macchina oscenamente lunghe.

Esempi

Reverse engineering degli intervalli di memoria

Il primo megabyte di memoria fisica è un semplice esempio con cui iniziare, anche se la sua struttura è già ben nota.

Mappa di calore del primo megabyte

I confini di latenza ci permettono di suddividere lo spazio degli indirizzi, senza fare affidamento sui layout riportati.

  1. Inizia con una semplice scansione di latenza: sudo ./mmiotic --start-address 0x0 --end-address 0x100000 --stride 4 --count 20 --quiet-mmap
  2. La latenza si assesta sui confini classici — DRAM fino a 0x9FFFF a ~380 cy, poi il buco video da 128 KB, che si divide in due a 0xB0000. Il cambiamento di varianza a 0x20000 potrebbe indicare un page walk diverso per la pagina null.
  3. A0000–AFFFF: lenta e irregolare (996 cy, stdev 327), instradata verso la Radeon accesa ma in idle. B0000–BFFFF: veloce e rigida (780 cy, stdev 3.2, legge ffffffff), non reclamata da nessuno. Dati dall'aspetto simile, ma un divario di varianza di 100x.
  4. C0000–FFFFF: /proc/iomem dice "System ROM", ma la scansione mostra latenza DRAM, non velocità flash — il BIOS è shadowato nella DRAM.

Registri mailbox non documentati

Scansiona uno spazio di configurazione del root complex (00:00.0, 4 KB) per individuare valori anomali di latenza rispetto a un minimo piatto di ~675 cicli:

Mappa di calore dei registri mailbox

La latenza della mailbox è significativamente più alta rispetto ai dati circostanti, e i picchi duplicati e le varianze equivalenti ci permettono di associare registri funzionalmente simili.

  1. Scansiona lo spazio di configurazione del root complex: sudo ./mmiotic --start-address 0xf8000000 --end-address 0xf8001000 --stride 4 --count 200
  2. Due dword sono i valori anomali: offset 0xe4 (1218 cy, valore 80e3110b) e 0xa4 (1199 cy, valore deadbeef). e4 è un doorbell documentato; a4 non è documentato.
  3. Latenza quasi identica, distanti 0x40, entrambi ben al di sopra del minimo — una famiglia di registri che raggiunge lo stesso target off-die, di cui solo e4 è pubblico.
  4. I valori differiscono: deadbeef viene letto come un sentinel non inizializzato/di errore — stessa mailbox, a4 non implementato o alimentato con input non valido.

Calibrazione degli interrupt

Latenze accuratamente selezionate possono talvolta essere usate in insoliti scenari di exploitation (MCHAMMER, smiiiiiiiiiiiiiiii):

Mappa di calore della calibrazione degli interrupt

Qui una Radeon in idle e senza driver trasforma una lettura allineata da 4 byte in uno stallo di ~100.000 cicli.

  1. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e00100 --stride 4 --count 50 — spazza l'inizio della BAR della GPU (0x90e00000, 256 KB). 0x90e00008 costa 110.152 cy; 0x90e00018, 16 byte più avanti, è di nuovo veloce a 1.523 — per-registro, non per-pagina.
  2. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e40000 --stride 4 --count 1 --binary — --binary sonda in ordine bit-reversal, quindi l'intera apertura da 256 KB viene coperta uniformemente dopo 1.012 sonde, mappando un blocco contiguo da 48 KB in cui ogni registro è lento.
  3. Probabilmente, la latenza è dovuta a un round-trip dell'SMU per togliere il gate da un dominio clock/power-gated — quindi la mappa di latenza estrae il layout di alimentazione della GPU, senza bisogno di driver o datasheet.

Peek killer

Idealmente, leggere un indirizzo fisico sarebbe un'operazione relativamente sicura, ma mmiotic è particolarmente bravo a scoprire accidentalmente le eccezioni:

Mappa di calore della peek killer

Ad esempio, sulla piattaforma di cui sopra, una lettura da 1 byte di 0xdc5003b0 — offset 0x3b0 di una BAR di registri della iGPU Zen 4 senza driver (Region 5, 0xdc500000, 512 KB) — resetta il sistema in modo affidabile.

  1. sudo ./mmiotic --address 0xdc5003b0 --size 1 --count 1. Nessun output; la macchina si riavvia.
  2. A distanza di esattamente una dword: 0x3ac e 0x3b4 ai lati leggono 00000000 a ~3.200 cicli e sono innocui.
  3. Una scansione per-dword di 0x3a0–0x3fc trova 7 dword velenose intervallate da 17 sicure.
  4. sudo busybox devmem 0xdc5003b0 32 e sudo dd if=/dev/mem bs=1 count=1 skip=$((0xdc5003b0)) mandano giù la macchina se preferisci saltare il passaggio intermedio.

Utilizzo

[!WARNING] Alcune piattaforme si resettano quando specifiche regioni di indirizzi vengono sondate da mmiotic. Fai attenzione a dove lo usi.

Selezione del target

La base e la dimensione ECAM vengono rilevate automaticamente da ACPI MCFG (/sys/firmware/acpi/tables/MCFG). Puoi sovrascriverle con -M, --mmio-base / -Z, --mmio-size.

Scansione

--find-target/--find-longest trasformano la scansione in ricerca:

OpzioneEffetto
-F, --find-target <s>trova un indirizzo il cui tempo di accesso raggiunge s secondi, quindi aumenta la larghezza (4b non allineati → 8/16/32/64/512b) per spingerlo più in alto

Metodo di accesso

Output / esecuzione

Righe di risultato

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 aggiunge il suffisso cy ai conteggi di cicli e inserisce una coppia min/max di tempi scalati (-N li stampa come nanosecondi grezzi):

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

Setup

Compilazione:

root@kitploit:~
make

Viene eseguito come root per ottenere accesso a /dev/mem.

Se vedi: mmap ... Operation not permitted, prova ad avviare con iomem=relaxed per rimuovere CONFIG_STRICT_DEVMEM:

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

Poi esegui sudo update-grub e riavvia.

Nel mondo reale

mmiotic è stato usato per portare avanti una varietà di ricerche interne ed esterne, a volte in modi inaspettati. Alcuni esempi di applicazioni di mmiotic:

  • MCHAMMER: mmiotic calibra un'eccezione di machine check ritardata per la consegna di precisione dei segnali MC# in ambienti protetti.

  • smiiiiiiiiiiiiiiii: mmiotic individua l'istruzione ad alta latenza per interrompere il rendezvous SMM.

  • The Assembly Hall of Shame: mmiotic è ampiamente usato per l'importante problema della deottimizzazione delle prestazioni.

Autore

mmiotic è un progetto di ricerca di Christopher Domas (@xoreaxeaxeax).

Scarica lo strumento
OpzioneNomi
-b/-d/-f/-rPCI --bus/--device/--function/--register — decodificati rispetto alla base ECAM
-o, --offset <n>offset dalla base MMIO (salta la decodifica B/D/F)
-A, --address <n>un singolo indirizzo fisico; imposta implicitamente la base della regione
-a/-z--start-address/--end-address — un intervallo fisico; implica --scan
OpzioneEffetto
-S, --scanpercorre tutti gli indirizzi nella regione target
-t, --stride <n>passo tra gli indirizzi (predefinito: 4)
-n, --limit <n>si ferma dopo questo numero di indirizzi
--binarysonda in ordine bit-reversal — dopo k sonde l'intervallo ha una copertura uniforme con granularità ~range/k (vedi l'avviso sopra)
-x, --limitedintervallo di registri limitato (0x00–0xff vs 0x000–0xfff)
-e, --skipsalta le funzioni che leggono 0xffffffff all'offset 0 (dispositivi assenti)
-I, --iomemscansiona ogni regione di primo livello non–System-RAM in /proc/iomem
-R, --ioregion <name>scansiona le regioni di /proc/iomem la cui etichetta corrisponde a <name>, a qualsiasi profondità
-G, --find-longest
stessa ricerca, ma esaurisce ogni candidato invece di fermarsi al primo risultato
-B, --fallbacks <n>candidati portati nella fase di escalation (predefinito: 10)
OpzioneEffetto
-s, --size <n>byte per accesso: 1 / 2 / 4 (predefinito) / 8 / 16 (XMM) / 32 (YMM) / 64 (ZMM) / 512 (fxrstor). Le dimensioni > 4 sono fuori specifica ma funzionano sull'hardware testato; le larghezze AVX richiedono AVX / AVX-512F
-c, --count <n>campioni per indirizzo (predefinito: 1); viene riportato il minimo
-L, --lockmisura il tempo di un RMW con lock: lock xadd (dimensioni 1/2/4/8) o lock cmpxchg16b (dimensione 16). Riscrive il valore
-g, --gathermisura il tempo di una gather vettorizzata; --size 16/32/64 seleziona XMM/YMM/ZMM (AVX-512)
-w, --write-readcattura la latenza di scrittura misurando il tempo di una lettura che deve osservare una scrittura posted precedente — vedi sotto
-E, --enter (--enter-2, --enter-3)genera una raffica di fino a 30 accessi da un singolo enter $0, $31 — vedi sotto
-k, --continuein caso di fault fxrstor, scarta quel campione e continua la scansione
OpzioneEffetto
-C, --min-cycles <n>stampa solo i risultati con min_cycles >= n
-T, --timemostra i nanosecondi accanto ai cicli (rileva la frequenza TSC)
-N, --nanosecondcon --time, stampa i nanosecondi grezzi, senza scala automatica delle unità
-P, --progressavanzamento della scansione in tempo reale su stderr
-p, --processor <n>fissa alla CPU logica n (predefinito: 0) — riduce il rumore del timer
-u, --unboundnon fissare a un core
--lazy-mmapmappa in finestre da 2 GB su richiesta; richiesto per regioni > 2 GB
--quiet-mmapsopprime il rumore "mmap failed" dalle regioni inaccessibili
CampoSignificato
b/d/f.o.lbus/device/function, offset del registro, dimensione dell'accesso
offsetoffset dalla base MMIO — sostituisce b/d/f.o.l quando il target proviene da -o/-A/-a+-z
addressindirizzo fisico completo a 64 bit
min/maxaccesso più veloce e più lento osservato, in cicli
stdevdeviazione standard dei conteggi di cicli campionati
dynamic1 se il valore è cambiato in qualsiasi punto tra i campioni
valuevalore letto — per dimensioni oltre 8 byte, i primi 32 byte come qword separate da spazi
faultsaggiunto solo se un accesso ha generato un fault