
Una variante de Gargoyle para x64 para ocultar artefactos de memoria usando solo ROP y PIC
Una variante de Gargoyle para x64 para ocultar artefactos de memoria utilizando solo ROP y PIC.
Muchas gracias a @waldoirc por documentar gran parte de esta técnica en su blog Esta implementación es diferente porque no utiliza ninguna APC y está completamente implementada como PIC.
He creado esto para entender mejor cómo evadir artefactos de memoria utilizando una técnica similar a Gargoyle en x64. La idea es configurar una ROPChain llamando a VirtualProtect() -> Sleep() -> VirtualProtect() para marcar mi propia página como N/A mientras se duerme.
A diferencia de Gargoyle y otras implementaciones similares a Gargoyle, confío completamente en ROP y no encolo ninguna APC. DeepSleep en sí está implementado como completamente PIC, lo que facilita enumerar qué páginas de memoria deben ocultarse de los escáneres.
Mientras el hilo está activo, aparece un MessageBox y la página de DeepSleep se marca como ejecutable. Mientras duerme, la página se marca como N/A.
Esto elude efectivamente Moneta al momento de escribir esto si DeepSleep se inyecta y la dirección base del hilo en ejecución no apunta a memoria privada confirmada.
He verificado esto utilizando la técnica de inyección Earlybird para inyectar DeepSleep.bin en notepad.exe

Usando Mingw:
Escribe make y aparece un salvaje DeepSleep.bin.
Alternativamente, usa el DeepSleep.bin precompilado :-)
Podría lanzar un cargador para CS u otros agentes C2. De manera similar a YouMayPasser, el cargador engancharía sleep usando puntos de interrupción de hardware para evitar modificaciones sospechosas de kernel32.dll.
Esto fue probado en 10.0.19044 N/A Build 19044
Los ROPgadgets en los que confío podrían no existir en ntdll.dll en otras versiones de Windows. Probablemente sea una buena idea usar ROPgadgets más pequeños y genéricos y enumerar los gadgets en más dlls que solo ntdll.dll.
La pila de llamadas a un hilo en el estado DelayExecution incluye regiones de memoria desconocidas/alteradas y además incluye direcciones a VirtualProtect(). Hunt-Sleeping-Beacons detecta esto.
Podría ser posible aplicar esa métrica a otros C2 que utilicen una técnica diferente para esperar entre callbacks.

@waldoirc por documentar gran parte de la técnica aquí
@forrest Orr por Moneta
Josh Lospinoso por la técnica original Gargoyle