
Primitivas alternativas de leitura e escrita usando funções Rtl* de forma não intencional.
Um repositório com scripts para demonstrar primitivas alternativas de Leitura e Escrita usando funções Rtl* de uma forma não convencional.
RtlFillMemory recebe três argumentos: um ponteiro para a memória de destino, o número de bytes a serem gravados e um valor de byte único. Grava apenas um byte no bloco de memória especificado.
Primitiva de escrita usando uma combinação de RtlInitializeBitMapEx e RtlFillMemory.
Primeiro, ele percorre a string em blocos de 16 bytes, dividindo cada bloco em dois valores de 8 bytes. O primeiro bloco de 8 bytes é armazenado no primeiro argumento de RtlInitializeBitMapEx e o segundo bloco de 8 bytes é armazenado no segundo argumento.
Depois, se um bloco extra de 8 bytes permanecer, ele o grava usando RtlInitializeBitMapEx com um segundo parâmetro NULL.
Por fim, se restarem menos de 8 bytes, ele os grava um byte por vez usando RtlFillMemory até que toda a string seja copiada para o buffer de destino.
Primitiva de leitura usando RtlQueryDepthSList. Útil para caça a gadgets ROP, comparação de bytes, detecção de hooks, etc. Aqui, demonstro uma injeção de processo simples com gadget ROP. RtlQueryDepthSList aceita um único argumento — o endereço de memória para ler —, mas ele lê apenas 2 bytes e retorna um valor de 4 bytes.