
Master's Thesis research on CVE-2024-30051 (Windows DWM Heap Overflow). Features a high-reliability exploit with automated heap spray optimization, real-time logging, and empirical success-rate analysis. Portfolio piece demonstrating advanced Windows binary exploitation, heap layout manipulation, and LPE via Desktop Window Manager.
Windows 데스크톱 창 관리자(
dwmcore.dll)의 힙 기반 버퍼 오버플로우
로컬 권한 상승 → DWM 프로세스를 통한 무결성 수준 SYSTEM
빌드 대상: Windows 11 22H2 (10.0.22621.3447) · 패치: KB5037771
이 저장소는 Windows 데스크톱 창 관리자 핵심 라이브러리(dwmcore.dll)의 높은 심각도(CVSS 7.8)의 권한 상승 취약점인 CVE-2024-30051에 대한 석사 학위 논문 연구를 포함하고 있습니다.
취약점은 CCommandBuffer::Initialize의 정수 나눗셈 크기 계산 오류에서 비롯됩니다. 이 계산 오류로 인해 new()에 사용된 크기와 memcpy()에 사용된 크기가 달라져 0x8F 바이트의 힙 오버플로우가 발생합니다. 성공적인 익스플로잇은 dwm.exe가 공격자가 제어하는 DLL을 로드하여 window manager\dwm-1 계정으로 무결성 수준 SYSTEM에서 임의 코드를 실행하게 합니다.
CVE-2024-30051-Masters-Thesis/
├── README.md
├── LICENSE
├── setup.bat # s11.dll을 필요한 위치로 복사
│
├── exploit/
│ ├── C21.sln # Visual Studio 2022 솔루션
│ ├── exploit_src/
│ │ ├── c26f.vcxproj
│ │ ├── c26f.filters
│ │ └── main.cpp # 익스플로잇 — 힙 스프레이 + 후킹 + 오버플로우
│ └── payload/
│ ├── payload.vcxproj
│ ├── payload.vcxproj.filters
│ ├── dllmain.cpp # 페이로드 DLL — SYSTEM 셸 생성 + 정리
│ ├── framework.h
│ ├── pch.h
│ └── pch.cpp
│
└── docs/
├── screenshots/ # 패치 diffing, WinDbg 및 포렌식 캡처
└── analysis/
├── 01-root-cause.md # CCommandBuffer::Initialize의 정수 나눗셈 버그
├── 02-heap-spray.md # 50세션 실증 데이터 및 통계 결과
└── 03-timeline.md # 발견, 공개 및 패치 연대기
Visual Studio 2022에서 C21.sln을 엽니다. Release x64로 payload 프로젝트를 빌드합니다.
저장소 루트에서 setup.bat을 실행합니다. s11.dll을 C:\Users\Public\Documents\s11.dll(PAYLOAD_DLL_PATH에 정의된 경로)로 복사합니다.
⚠️ DLL은
C26f.exe를 실행하기 전에 반드시 이 정확한 경로에 있어야 합니다. 실행 파일 옆에 배치하면 작동하지 않습니다.
Release x64로 C26f 프로젝트를 빌드합니다.
x64\Release\C26f.exe
표준(비상승) CMD에서 실행합니다. 익스플로잇은 최대 10번 자동 재시도합니다.
성공하면 dwm.exe가 s11.dll을 로드하고 SYSTEM 무결성 수준의 CMD를 생성합니다.
세션 로그는 %TEMP%\cve_30051_log.txt에 기록됩니다.
#define MAX_ATTEMPTS 10 // Max auto-retry attempts per session
#define SPRAY_STEP 0x10 // Hole spacing index (1024 holes)
#define SPRAY_RANGE_START 0x3000 // Spray range start index
#define SPRAY_RANGE_END 0x7000 // Spray range end index
#define SLEEP_POST_SPRAY 0xC8 // ms wait after spray (200ms)
#define SLEEP_POST_HOLES 0xC8 // ms wait after freeing holes (200ms)
#define PAYLOAD_DLL_PATH "C:\\Users\\Public\\Documents\\s11.dll"
CCommandBuffer::Initialize(dwmcore.dll 10.0.22621.3447)에서 CD2DSharedBuffer::GetBufferSize가 두 번 호출됩니다. new()에 전달된 크기는 곱셈 전에 0x90으로 정수 나눗셈을 거치는 반면, memcpy()는 원시 값을 사용합니다:
buffer_size = GetBufferSize() → e.g. 0x23F
size_new = (0x23F / 0x90) * 0x90 = 0x1B0 ← allocated
size_memcpy = 0x23F ← copied
overflow = 0x23F - 0x1B0 = 0x8F bytes
빌드 10.0.22621.3447(취약)과 10.0.22621.3593(패치) 간 BinDiff 비교:
전체 유사도 0.98과 대조되는 0.32의 이상 점수는 취약점 위치의 직접적인 신호입니다.
1. Hook RtlCreateHeap → dwmcore 힙 핸들 캡처
2. Hook RtlAllocateHeap → 기본 청크 주소 캡처
3. Hook NtDCompositionCreateChannel → MappedAddress(공유 메모리 영역) 캡처
4. Hook NtDCompositionCommitChannel → 크기 필드 덮어쓰기 (0x120 → 0x23F)
추가 배치 명령 주입
5. 힙 스프레이 0x10000개의 CHolographicInteropTexture 객체(크기=0x1B0)
6. 0x10 인덱스마다 구멍 해제 → 오버플로우 착지를 위한 갭 생성
7. 페이로드를 오버플로우 버퍼에 쓰기 → KCBTable+0x388 + LoadLibraryA + DLL 경로
8. 모든 스프레이 객체 해제 → 오버플로우 트리거 → LoadLibraryA("s11.dll")
9. dwm.exe가 페이로드 DLL 로드 → SYSTEM 무결성으로 CMD 생성
사용 가능한 RAM이 성공적인 힙 스프레이에 필요한 시도 횟수에 영향을 미칩니까?
각 25세션의 두 블록. 세션별 프로토콜: 깨끗한 부팅 후 스냅샷 복원 → 100초 안정화 대기 → 익스플로잇 실행 → 성공 시도 기록.
| 블록 | RAM | 세션 | 성공 | 실패 |
|---|---|---|---|---|
| A | 8,192 MB | 25 | 24 | 1 |
| 테스트 | 통계량 | p-value | 결론 |
|---|---|---|---|
| Mann-Whitney U | U = 184.0 | p = 0.031 | H₀ 기각 |
| Welch's t-test | t(23) = −2.695 | p = 0.011 | H₀ 기각 |
base = heap_base + 0x720은 결정론의 주요 동인이 구멍 밀도가 아니라 재현 가능한 부팅 후 힙 레이아웃임을 확인합니다.전체 원시 데이터, 세션 로그 형식 및 결정적 힙 관찰 내용은 docs/analysis/02-heap-spray.md에 문서화되어 있습니다.
성공하면 window manager\dwm-1 아래에 CMD 창이 열립니다:
=====================================================
CVE-2024-30051 - Windows DWM Heap Overflow EoP
CWE-122 | CVSS 7.8 | Elevation of Privilege
=====================================================
Researched and reproduced by : devianntsec
Original PoC by : Ricardo Narvaja (Fortra)
Target : Windows 11 22H2 (22621.3447)
=====================================================
[*] Current user:
window manager\dwm-1
[*] Mandatory Integrity Level:
Mandatory Label\System Mandatory Level S-1-16-16384
[*] Enabled privileges:
SeImpersonatePrivilege Enabled
=====================================================
Shell running under DWM process - SYSTEM level
=====================================================
아티팩트(s11.dll 및 .bat 스크립트)는 지연 정리 프로세스를 통해 5초 후 자동으로 삭제됩니다.
| 문서 | 설명 |
|---|---|
| 근본 원인 분석 | CCommandBuffer::Initialize의 정수 나눗셈 버그, 패치 diffing 방법론 |
이 연구는 사이버보안 석사 학위 논문(UCAM — Campus Internacional de Ciberseguridad)의 일부로, 여러 환경에서 N-Day 취약점을 분석합니다.
이 CVE는 논문 내 Windows 데스크톱 애플리케이션 벡터를 나타내며, 다음을 시연합니다:
키워드: EoP · Heap Overflow · DirectComposition · DWM · Patch Diffing · BinDiff · WinDbg · Heap Spray · Empirical Analysis · CVE-2024-30051
Annais Molina (devianntsec) — 사이버보안 석사 과정
MIT 라이선스 — LICENSE 참조
이 저장소는 학술 석사 학위 논문의 일부로서 교육 및 보안 연구 목적으로만 제공됩니다. 모든 테스트는 네트워크에 노출되지 않은 격리된 가상 머신에서 수행되었습니다. 귀하가 소유하거나 명시적인 서면 승인을 받은 시스템에서만 사용하십시오. 시스템에 대한 무단 사용은 불법이며 형사 기소로 이어질 수 있습니다.
| 측면 | 설명 |
|---|
| 패치 diffing | CCommandBuffer::Initialize를 정확한 취약점 위치로 식별하는 완전한 BinDiff 분석 (14,062개 일치 함수 중 유사도 점수 0.32 vs 전역 0.98) |
| WinDbg 동적 분석 | 모든 4개 후크, 크기 필드 덮어쓰기 및 페이로드 구성의 단계별 검증 |
| 실증 힙 스프레이 분석 | 두 가지 RAM 구성(8,192MB 및 4,096MB)에서 공식 통계 테스트를 포함한 50개의 통제된 세션 |
| 통계적 발견 | Mann-Whitney U(p = 0.031) 및 Welch t-검정(p = 0.011)이 RAM 효과를 확인; 관측 평균이 이론적 예측( |
| 페이로드 DLL 경로 중앙화 | 하드코딩된 경로를 #define PAYLOAD_DLL_PATH 전처리기 상수로 추출 |
| 세션 로깅 | 각 세션당 전체 타임스탬프 로그가 %TEMP%\cve_30051_log.txt에 기록됨 |
| 학술 문서 | 근본 원인, 50세션 힙 스프레이 분석 및 CVE 타임라인 |
| 메트릭 | 값 |
|---|
| 전체 유사도 | 0.98 |
| 신뢰도 | 0.99 |
| 일치 함수 | 14,062 (99.1%) |
CCommandBuffer::Initialize 유사도 | 0.32 |
| 기본 블록 — 취약한 버전 | 4 |
| 기본 블록 — 패치된 버전 | 20 (16개 검증 블록 추가) |
| B |
| 4,096 MB |
| 25 |
| 24 |
| 1 |
| 블록 | RAM | 평균 시도 | 표준편차 | 95% CI | 이론 대비 비율 (64) |
|---|
| A | 8,192 MB | 3.375 | 1.135 | [2.896; 3.854] | ≈ 19× 더 빠름 |
| B | 4,096 MB | 4.958 | 2.645 | [3.841; 6.076] | ≈ 12.9× 더 빠름 |
| 아티팩트 | 위치 | 지속성 | 탐지 도구 |
|---|
dwm.exe의 자식 cmd.exe | 보안 이벤트 로그 | 예 (프로세스 감사가 활성화된 경우) | Event ID 4688 |
dwm.exe에 접근하는 외부 프로세스 | Sysmon | 예 | Sysmon Event ID 10 |
실패 시도 시 dwm.exe 충돌 | 애플리케이션 이벤트 로그 | 예 | Event ID 1000 |
디스크의 페이로드 DLL s11.dll | C:\Users\Public\Documents\ | 처음 약 5초 동안만 | SHA-256 모니터링 |
| 힙 스프레이 분석 | 50세션 실증 데이터, 원시 세션 데이터, 통계 테스트 |
| CVE 타임라인 | 발견, 공개 및 패치 연대기 |