x64 아키텍처에서 IDT를 이용한 사용자 모드에서 커널 모드 권한 상승 기법

서론

본 문서는 x64 환경에서 인터럽트 디스크립터 테이블(IDT)을 조작하여 사용자 모드(R3)에서 커널 모드(R0)로의 제어 흐름 전환을 수행하는 기술을 설명합니다. Windows 10 버전 1703 기준으로 검증된 방법이며, 하드웨어 보호 메커니즘과 페이지 테이블 구조를 우회하는 과정을 포함합니다.

1. IDT 항목 구성

IDT 내 특정 인터럽트 벡터(예: 0x21)에 사용자 정의 핸들러를 등록합니다. 이 핸들러는 사용자 공간에 위치하나, 인터럽트 발생 시 커널 모드에서 실행됩니다.

; 예: IDT[0x21] 설정 (물리 주소 기반)
eq fffff800`54862210 4000ee00`00101110
eq fffff800`54862218 00000000`00000001

상기 코드는 세그먼트 선택자, 접근 권한, 오프셋 등을 포함한 게이트 디스크립터를 구성하며, 실행 코드의 시작 주소는 0x0140001110입니다.

2. SMEP/SMAP 비활성화

CR4 레지스터의 20번(SMEP) 및 21번(SMAP) 비트는 커널 모드에서 사용자 영역 코드 실행 및 데이터 접근을 차단합니다. 본 기법은 사용자 공간에 위치한 핸들러를 커널에서 실행하므로 해당 비트를 클리어해야 합니다.

; 원본 값
cr4 = 0x0000000000170678

; 수정 후 (SMEP/SMAP 비활성화)
cr4 = 0x0000000000070678

이 작업은 일반적으로 다른 커널 취약점을 통해 CR4 값을 조작하거나, 임시로 보호 기능을 해제하는 방식으로 수행됩니다.

3. KPTI(Kernel Page Table Isolation) 우회

KPTI 활성화 시, R3와 R0는 각각 독립된 페이지 테이블을 사용합니다. 따라서 커널 내부 함수 호출을 위해선 반드시 커널 전용 페이지 테이블(CR3)로 전환해야 합니다.

swapgs                    ; KPCR 접근을 위한 GS 세그먼트 전환
mov rax, gs:[0x7000]      ; 커널 CR3 값 읽기 (KPCR->rcr3)
mov cr3, rax              ; 현재 CR3를 커널 페이지 테이블로 교체

필요 시 페이지 엔트리(PML4E, PDPTE, PDE, PTE)의 NX 비트 또는 사용자 비트를 수정하여 실행 가능 상태로 만들어야 할 수 있으나, 일부 환경에서는 기본 설정으로도 작동합니다.

4. 스택 컨텍스트 설정

인터럽트 진입 시 자동으로 저장된 컨텍스트는 TSS 기반 스택에 위치합니다. 이를 안정적인 커널 스택으로 마이그레이션해야 합니다. 다음은 실제 커널 루틴(KiBreakpointTrapShadow)에서 참고한 절차입니다.

; 임시 스택 포인터 계산 (TSS 스택 기반)
lea rdi, [rsp + 0x38]

; 커널 스레드 스택으로 전환
mov rsp, gs:[0x7008]

; 이전 컨텍스트 복원 (SS, RSP, RFLAGS, CS, RIP 순서)
push qword ptr [rdi - 0x08]    ; SS
push qword ptr [rdi - 0x10]    ; RSP
push qword ptr [rdi - 0x18]    ; RFLAGS
push qword ptr [rdi - 0x20]    ; CS
push qword ptr [rdi - 0x28]    ; RIP

; RSI 복원 (원래 값)
mov rsi, [rdi - 0x38]

이후 모든 커널 API 및 내부 함수 호출이 정상적으로 수행될 수 있는 상태가 됩니다.

5. 복귀 프로세스

커널 작업 완료 후에는 원래 상태를 복구해야 하며, 순서는 다음과 같습니다.

; 스택 및 CR3 복원
mov rsp, original_rsp_value
mov cr3, user_cr3_value

; 레지스터 상태 복구
pop rax
pop rsi

; IRETQ 또는 유사 명령어로 사용자 모드 복귀

복귀 시 잘못된 스택 상태나 CR3 유지 시 시스템 크래시가 발생할 수 있으므로 주의가 필요합니다.

태그: IDT x64 KPTI SMEP ring0

9월 13일 18:36에 게시됨