
Uma variante do Gargoyle para x64 para ocultar artefatos de memória usando apenas ROP e PIC
Uma variante do Gargoyle para x64 para ocultar artefatos de memória usando apenas ROP e PIC.
Muito obrigado ao @waldoirc por documentar grandes partes desta técnica em seu blog
Esta implementação é diferente por não fazer uso de APCs e ser totalmente implementada como PIC.
Criei isto para entender melhor como evadir artefatos de memória usando uma técnica semelhante ao Gargoyle no x64. A ideia é configurar uma ROPChain chamando VirtualProtect() -> Sleep() -> VirtualProtect() para marcar minha própria página como N/A enquanto estiver em Sleep.
Diferente do Gargoyle e outras implementações semelhantes, confio totalmente em ROP e não enfileiro nenhum APC. O DeepSleep em si é implementado como totalmente PIC, o que facilita enumerar quais páginas de memória devem ser ocultadas dos scanners.
Enquanto a thread está ativa, uma MessageBox aparece e a página do DeepSleep é marcada como executável. Durante o Sleep, a página é marcada como N/A.
Isso efetivamente contorna o Moneta no momento em que escrevo, se o DeepSleep for injetado e o endereço base da thread em execução não apontar para memória privada confirmada.
Verifiquei isso usando a técnica de injeção Earlybird para injetar DeepSleep.bin no notepad.exe

Usando Mingw:
Digite make e um DeepSleep.bin selvagem aparece.
Alternativamente, use o DeepSleep.bin pré-compilado :-)
Posso lançar um loader para CS ou outros agentes C2. Similar ao YouMayPasser, o loader usaria hooks de sleep via HW breakpoints para evitar modificações suspeitas no kernel32.dll.
Isso foi testado em 10.0.19044 N/A Build 19044
Os ROPgadgets dos quais dependo podem não existir no ntdll.dll em outras versões do Windows. Provavelmente é uma boa ideia usar ROPgadgets menores e mais genéricos e enumerar os gadgets em mais dlls além do ntdll.dll.
A callstack de uma thread no estado DelayExecution inclui regiões de memória desconhecidas/adulteradas e adicionalmente inclui endereços para VirtualProtect(). Hunt-Sleeping-Beacons detecta isso.
Pode ser possível aplicar essa métrica a outros C2 que usam uma técnica diferente para esperar entre callbacks.

@waldoirc por documentar grandes partes da técnica aqui
@forrest Orr pelo Moneta
Josh Lospinoso pela técnica original do Gargoyle