Zmsr
This repository contains a Proof of Concept (PoC) for a kernel-mode arbitrary code execution vulnerability in cpuz154_x64.sys using unvalidated rdmsr and wrmsr IOCTLs.
- Active · last change 8-4-2025
- ★ 1 on GitHub
README
CVE-2025-51060 Proof of Concept (PoC)
This repository contains a Proof of Concept (PoC) for a kernel-mode arbitrary code execution vulnerability in cpuz154_x64.sys using unvalidated rdmsr and wrmsr IOCTLs.
Language
한국어
CVE-2025-51060 PoC 설명
cpuz154_x64.sys 드라이버에서 검증되지 않은 rdmsr 및 wrmsr IOCTL을 활용한 커널 모드 임의 코드 실행 PoC입니다.
동작 원리
- KiSystemCall64 주소 획득:
- 검증되지 않은
rdmsrDeviceIoControl(0x9C402440)을 사용하여KiSystemCall64주소를 읽어옵니다. rdmsr없이도KiSystemCall64주소를 쿼리로 유추 가능합니다.
- 검증되지 않은
- KiSystemCall64 주소 변조:
- 검증되지 않은
wrmsrDeviceIoControl(0x9C402444)을 사용하여KiSystemCall64의 주소를 미리 찾아둔pop rcx; ret;가젯 주소로 덮어씌웁니다 (MSR_LSTAR에 기록).
- 검증되지 않은
- ROP 체인 구성:
syscall호출 전, 스택에 특정 가젯을 순서대로push하여 리턴 주소를 조작하고 필요한 opcode를 실행합니다.- 스택 푸시 순서:
SmepOffQueryMovCr4RcxRetGadgetSyscallHandler(사용자 정의 함수 주소)PopRcxRetGadgetFinish(syscall 호출 지점으로 복귀하기 위한 주소)SysretGadget
- ROP 체인 실행 흐름:
- KiSystemCall64:
wrmsr로 변조된pop rcx; ret;가젯으로 시작. - pop rcx; ret:
SmepOffQuery를rcx에 로드하고MovCr4RcxRetGadget으로 리턴. - SmepOff:
rcx(SmepOffQuery) 값을cr4에 기록하여 SMEP 비활성화,SyscallHandler로 리턴. - SyscallHandler: 사용자 정의 함수 호출,
MSR_LSTAR및CR4를 원본 값으로 복구,PrepareSysret로 리턴. - PrepareSysret:
Finish주소를rcx에 로드,GoFinish로 리턴. - GoFinish:
sysret을 호출하여rcx에 저장된Finish주소로 복귀. - Finish: ROP 체인 종료,
popfq,pop,ret실행.
- KiSystemCall64:
English
CVE-2025-51060 PoC Description
This PoC demonstrates kernel-mode arbitrary code execution in cpuz154_x64.sys by exploiting unvalidated rdmsr and wrmsr IOCTLs.
How It Works
- Obtaining KiSystemCall64 Address:
- Uses unvalidated
rdmsrDeviceIoControl(0x9C402440) to read theKiSystemCall64address. - The address can also be inferred via query without
rdmsr.
- Uses unvalidated
- Overwriting KiSystemCall64 Address:
- Uses unvalidated
wrmsrDeviceIoControl(0x9C402444) to overwriteKiSystemCall64with the address of apop rcx; ret;gadget, written toMSR_LSTAR.
- Uses unvalidated
- ROP Chain Setup:
- Before invoking
syscall, specific gadgets are pushed onto the stack to manipulate return addresses and execute required opcodes. - Stack push order:
SmepOffQueryMovCr4RcxRetGadgetSyscallHandler(user-defined function address)PopRcxRetGadgetFinish(address to return to after syscall)SysretGadget
- Before invoking
- ROP Chain Execution Flow:
- KiSystemCall64: Modified by
wrmsrto point topop rcx; ret;gadget, initiating the ROP chain viasyscall. - pop rcx; ret: Loads
SmepOffQueryintorcxand returns toMovCr4RcxRetGadget. - SmepOff: Writes
rcx(SmepOffQuery) tocr4to disable SMEP, returns toSyscallHandler. - SyscallHandler: Executes user-defined function, restores
MSR_LSTARandCR4to original values, returns toPrepareSysret. - PrepareSysret: Loads
Finishaddress intorcx, returns toGoFinish. - GoFinish: Executes
sysret, returning to theFinishaddress stored inrcx. - Finish: Terminates ROP chain with
popfq,pop, andret.
- KiSystemCall64: Modified by

