
Primitivas alternativas de lectura y escritura utilizando funciones Rtl* de forma no intencionada.
Un repositorio con scripts para demostrar primitivas alternativas de lectura y escritura usando funciones Rtl* de la manera no prevista.
RtlFillMemory toma tres argumentos: un puntero a la memoria de destino, el número de bytes a escribir y un valor de un solo byte. Escribe solo un byte en el bloque de memoria especificado.
Primitiva de escritura usando una combinación de RtlInitializeBitMapEx y RtlFillMemory.
Primero, recorre la cadena en fragmentos de 16 bytes, dividiendo cada bloque en dos valores de 8 bytes. El primer bloque de 8 bytes se almacena en el primer argumento de RtlInitializeBitMapEx y el segundo bloque de 8 bytes se almacena en el segundo argumento.
Luego, si queda un bloque adicional de 8 bytes, lo escribe usando RtlInitializeBitMapEx con un segundo parámetro NULL.
Finalmente, si quedan menos de 8 bytes, los escribe byte a byte usando RtlFillMemory hasta que toda la cadena se copia en el búfer de destino.
Primitiva de lectura usando RtlQueryDepthSList. Útil para la búsqueda de gadgets ROP, comparación de bytes, detección de hooks, etc. Aquí demuestro una inyección de procesos simple con un gadget ROP. RtlQueryDepthSList acepta un solo argumento—la dirección de memoria desde la que leer—, pero solo lee 2 bytes y devuelve un valor de 4 bytes.