DEP

DEP(Data execution protect)数据执行保护,这个功能需要操作系统和硬件的共同支持才可以生效。DEP的原理就是在系统的内存页中设置了一个标志位,标示这个内存页的属性(可执行)。

在硬件上这个工作就交给了CPU来完成,intel CPU在内存页中设置了XD标志位,amd CPU在内存页中设置了NX标志位,都标志了内存页的执行权限。

在操作系统方面,windows xp sp2从开始支持DEP的功能,但是必须将操作系统运行在PAE(Physical address extension)模式下,即使用硬件的这个标志位。

WINXP SP2 默认 /NOEXECUTE = OPTIN;DEP只是对一些必须的windows程序和服务起效。

WIN2K3 SP1默认 /NOEXECUTE = OPTOUT;DEP对所有的windows程序和服务起效,除非是用户自己排除的程序。

ASLR(Address space layout randomization)windows系统中运行的同一个程序其模块加载的地址空间是随机的,也是防止恶意代码攻击的一种手段。(纯系统级别的实现)我们自己编写的程序或者链接库,可以通过设置一个链接选项,Project Property -> Configuration Properties -> Linker -> Advanced -> Randomized Base Address,来设置是否支持ASLR。

绕过DEP的方法:

直接利用程序中没有ASLR特性的模块,寻找能够利用的汇编指令,xchg eax, esp   retn,   pop ebx      retn等等,找到这些特殊的指令,接下来就是构造一个适合这些指令使用的栈数据了,这个执行过程就利用原来模块的执行内存,我们的栈数据也仍然是作为数据使用,不会被DEP检测到。比如WinExec、system已经在程序中被调用,我们只需要将调用处的地址拿过来,放到ret语句中,并配置好适当的参数。这种方式非常巧妙,都不需要写入一堆代码到内存中,但是前提是你需要使用的API原来程序中都有。

 

调用参数

覆盖方向—>

/bin/sh

虚假的返回地址

返回地址

system函数的入口地址

EBP上层函数堆栈基址

溢出的变量覆盖区域,

在这里填充适当的数据,

作为system函数的参数。

(调用其他的API也是类似)

异常处理代码入口地址

(如果函数设置异常处理)

局部变量

有了上面执行API的条件,我们就可以利用以下方法,改变进程或者内存页的DEP属性。

1、通过调用API赋予内存可执行的权限,包括VirtualAlloc  HeapCreate等函数,可以改变内存页的执行属性。

2、通过调用API取消系统对本进程的DEP检测,SetProcessDEPPolicy,但是使用这个函数需要满足条件:

# 操作系统是vista sp1、winxp sp3、win2k8

# 操作系统DEP的模式设置为OPTIN   OPTOUT,如果是AlwaysON就没有办法了。

3、通过NT!NTSetInformationProcess函数关闭本进程的DEP检测,nt5.1都可以实现,vista版本也可以,但是vista sp1之后就不行了。

4、通过WriteProcessMemory把执行代码写入到可执行的内存页中。

原文地址:https://www.cnblogs.com/sideny/p/3479192.html