Tatsache, war mir gar nicht mehr bewusst. Immer noch nicht c&p fertig (aber es sollte erkennbar sein was zu ändern ist):
Code:
DWORD ropChain[] = { // EIP = NtWaitForSingleObject
(DWORD)&NtClose, // Return address
(DWORD)duplicatedProcessHandle, // Own process handle
FALSE, // Alertable
NULL, // Timeout
// EIP = NtClose
(DWORD)&NtSetInformationFile, // Return address
(DWORD)duplicatedProcessHandle, // Own process handle
// EIP = NtSetInformationFile
(DWORD)&NtClose, // Return addr
(DWORD)duplicatedFileHandle, // File handle
(DWORD)addressForROP, // Pointer to IoStatusBlock
// See above.
(DWORD)addressForROP, // Pointer to FileInformation
// Just needs a TRUE value
sizeof(FILE_DISPOSITION_INFORMATION), // Length
FileDispositionInformation, // FILE_INFORMATION_CLASS
// EIP = NtClose
(DWORD)&RtlExitUserThread, // Ret. addr
(DWORD)duplicatedFileHandle, // File handle
// EIP = RtlExitUserThread
STATUS_CANNOT_DELETE, // Shutdown reason
};
Das mit den Calling-conventionen stimmt nicht unbedingt. Ich hab es ehrlich gesagt nicht ausprobiert aber vielleicht gibt es
Code:
mov rcx, [rsp + 8]
ret
pop rdx
RET
und ähnliches (natürlich auch für r8 & r9) womit es dann doch möglich wäre.