
Esta novedosa forma de usar NtQueueApcThreadEx abusando de los parámetros ApcRoutine y SystemArgument[0-3] al pasar un gadget aleatorio pop r32; ret puede utilizarse para una inyección de código sigilosa.
Esta novedosa forma de usar NtQueueApcThreadEx abusando de los parámetros ApcRoutine y SystemArgument[0-3] pasando un gadget pop r32; ret aleatorio puede usarse para inyección de código sigilosa. Dentro de este PoC, el gadget en este caso se elige aleatoriamente de la región de memoria de ntdll.dll que coincide con un patrón específico. Esto significa que el gadget retorna hacia el shellcode.
IMAGE_SCN_CNT_CODE y IMAGE_SCN_MEM_EXECUTE dentro de en memoria.ntdll.dllNtQueueApcThreadEx, ApcRoutine = dirección del gadget elegida aleatoriamente, SystemArgument = puntero al shellcodeNtQueueApcThreadEx forzará el IP al gadget ntdll.dll!<random pop r32; ret> y retornará a SystemArgument1Hay cientos de gadgets que pueden usarse dentro de ntdll.dll (al menos desde mi compilación), lo que hace que esto sea difícil de detectar.
Al inspeccionar la llamada, a diferencia de la inyección APC tradicional, ApcRoutine simplemente apuntará a una dirección legítima dentro de ntdll.dll.

Esto probablemente sea un poco difícil de detectar. Al inspeccionar las llamadas a NtQueueApcThreadEx, verifica si alguno de los argumentos apunta a memoria ejecutable. Otra posible vía de detección es verificar si ApcRoutine apunta a una dirección dentro de ntdll; sin embargo, esto probablemente genere muchos falsos positivos.
Esta técnica fue detallada originalmente en el análisis de Raspberry Robin de Avast aquí.