
Cette nouvelle façon d'utiliser NtQueueApcThreadEx en abusant des paramètres ApcRoutine et SystemArgument[0-3] en passant un gadget aléatoire pop r32; ret peut être utilisée pour une injection de code furtive.
Cette nouvelle façon d'utiliser NtQueueApcThreadEx en abusant des paramètres ApcRoutine et SystemArgument[0-3] avec un gadget aléatoire de type pop r32; ret peut être utilisée pour une injection de code furtive. Dans ce PoC, le gadget est choisi aléatoirement dans la région mémoire de ntdll.dll correspondant à un motif précis. Cela signifie que le gadget retourne dans le shellcode.
IMAGE_SCN_CNT_CODE et IMAGE_SCN_MEM_EXECUTE dans ntdll.dll en mémoire.NtQueueApcThreadEx, ApcRoutine = adresse du gadget choisie aléatoirement, SystemArgument = pointeur vers le shellcodeNtQueueApcThreadEx forcera le pointeur d'instruction vers le gadget ntdll.dll!<random pop r32; ret>, puis retournera dans SystemArgument1Il existe des centaines de gadgets utilisables dans ntdll.dll (au moins dans ma version), ce qui rend la détection délicate.
En inspectant l'appel, contrairement à l'injection APC classique, ApcRoutine pointera simplement vers une adresse légitime dans ntdll.dll.

C'est probablement un peu délicat à détecter. Lors de l'inspection des appels à NtQueueApcThreadEx, vérifiez si l'un des arguments pointe vers de la mémoire exécutable. Une autre piste de détection possible consiste à vérifier si ApcRoutine pointe vers une adresse dans ntdll — mais cela risque de générer beaucoup de faux positifs.
Cette technique a été initialement décrite dans l'article d'Avast sur Raspberry Robin ici.