
Primitive alternative di lettura e scrittura che utilizzano le funzioni Rtl* in modo non previsto.
Un repository con script per dimostrare primitive di lettura e scrittura alternative utilizzando le funzioni Rtl* in modo non convenzionale.
RtlFillMemory accetta tre argomenti: un puntatore alla memoria di destinazione, il numero di byte da scrivere e un singolo valore byte. Scrive solo un byte nel blocco di memoria specificato.
Primitiva di scrittura utilizzando una combinazione di RtlInitializeBitMapEx e RtlFillMemory.
Innanzitutto, scorre la stringa in blocchi da 16 byte, dividendo ciascun blocco in due valori da 8 byte. Il primo blocco da 8 byte viene memorizzato nel primo argomento di RtlInitializeBitMapEx e il secondo blocco da 8 byte viene memorizzato nel secondo argomento.
Quindi, se rimane un blocco extra da 8 byte, lo scrive utilizzando RtlInitializeBitMapEx con un secondo parametro NULL.
Infine, se rimangono meno di 8 byte, li scrive uno alla volta utilizzando RtlFillMemory finché l'intera stringa non viene copiata nel buffer di destinazione.
Primitiva di lettura che utilizza RtlQueryDepthSList. Utile per la ricerca di gadget ROP, il confronto di byte, il rilevamento di hook, ecc. Qui dimostro una semplice iniezione di processo con un gadget ROP. RtlQueryDepthSList accetta un singolo argomento—l'indirizzo di memoria da cui leggere, ma legge solo 2 byte e restituisce un valore a 4 byte.