• 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把执行代码写入到可执行的内存页中。

  • 相关阅读:
    9种纯CSS3人物信息卡片动态展示效果
    CSS3 animation属性 实现转动效果
    炫酷CSS3垂直时间轴特效
    css实现翻面效果
    uniapp上传图片转base64码
    经常使用的js三元表达式
    async/await 使用
    Python的OS模块批量修改文件名
    解决Tomcat对POST请求文件上传大小的限制
    HTTP 413错误解决方法
  • 原文地址:https://www.cnblogs.com/sideny/p/3479192.html
Copyright © 2020-2023  润新知