
Esta forma inovadora de usar NtQueueApcThreadEx, abusando dos parâmetros ApcRoutine e SystemArgument[0-3] ao passar um gadget aleatório pop r32; ret, pode ser usada para injeção de código furtiva.
Esta nova forma de usar NtQueueApcThreadEx abusando dos parâmetros ApcRoutine e SystemArgument[0-3], passando um gadget aleatório pop r32; ret, pode ser usada para injeção de código furtiva. Neste PoC, o gadget, neste caso, é escolhido aleatoriamente da região de memória de ntdll.dll que corresponde a um padrão específico. Isso significa que o gadget retorna para dentro do shellcode.
IMAGE_SCN_CNT_CODE e IMAGE_SCN_MEM_EXECUTE dentro de ntdll.dll na memória.NtQueueApcThreadEx, ApcRoutine = endereço do gadget escolhido aleatoriamente, SystemArgument = ponteiro para o shellcodeNtQueueApcThreadEx forçará o IP para o gadget ntdll.dll!<random pop r32; ret> e retornará para dentro de SystemArgument1Existem centenas de gadgets que podem ser usados dentro de ntdll.dll (na minha build, pelo menos) - tornando isso difícil de detectar.
Ao inspecionar a chamada, ao contrário da injeção de APC tradicional, ApcRoutine simplesmente apontará para um endereço legítimo dentro de ntdll.dll.

Isso provavelmente é um pouco complicado de detectar. Ao inspecionar chamadas para NtQueueApcThreadEx, verifique se algum dos argumentos aponta para memória executável. Outro possível caminho de detecção é verificar se ApcRoutine aponta para um endereço dentro de ntdll - no entanto, isso provavelmente gerará muitos falsos positivos.
Esta técnica foi originalmente detalhada no writeup do Raspberry Robin da Avast aqui.