
Diese neuartige Methode zur Verwendung von NtQueueApcThreadEx durch Missbrauch der ApcRoutine- und SystemArgument[0-3]-Parameter, indem ein zufälliges `pop r32; ret`-Gadget übergeben wird, kann für eine heimliche Code-Injektion verwendet werden.
Diese neuartige Methode, NtQueueApcThreadEx zu verwenden, indem die Parameter ApcRoutine und SystemArgument[0-3] missbraucht werden und ein zufälliges pop r32; ret-Gadget übergeben wird, kann für eine heimliche Code-Injektion genutzt werden. In diesem PoC wird das Gadget zufällig aus der Speicherregion von ntdll.dll ausgewählt, die einem bestimmten Muster entspricht. Das bedeutet, dass das Gadget in den Shellcode zurückspringt.
ntdll.dll im Speicher finden, die IMAGE_SCN_CNT_CODE und entsprechen.IMAGE_SCN_MEM_EXECUTENtQueueApcThreadEx-Aufruf einrichten: ApcRoutine = zufällig gewählte Gadget-Adresse, SystemArgument = Zeiger auf den ShellcodeNtQueueApcThreadEx zwingt den IP zum Gadget ntdll.dll!<random pop r32; ret> und springt anschließend in SystemArgument1 zurückEs gibt Hunderte von Gadgets, die innerhalb von ntdll.dll verwendet werden können (zumindest in meinem Build) - was die Erkennung erschwert.
Bei der Untersuchung des Aufrufs zeigt ApcRoutine - anders als bei der traditionellen APC-Injektion - schlicht auf eine legitime Adresse innerhalb von ntdll.dll.

Dies dürfte etwas schwierig zu erkennen sein. Bei der Untersuchung von Aufrufen von NtQueueApcThreadEx sollte geprüft werden, ob eines der Argumente auf ausführbaren Speicher zeigt. Ein weiterer möglicher Erkennungsansatz besteht darin, zu prüfen, ob ApcRoutine auf eine Adresse innerhalb von ntdll zeigt - dies führt jedoch wahrscheinlich zu vielen Fehlalarmen.
Diese Technik wurde ursprünglich in Avasts Blogbeitrag über Raspberry Robin hier ausführlich beschrieben.