DEP学习

SEH表的信息在内存中是加密存放的,所以突破它可能性不大······································································

chick if this is a  valid handler 失败而告终  这是软件DEP的杰作

种类:

1)软件DEP  就是前面学习过的 SafeSEH 目的是阻止利用SEH的攻击  与CPU硬件无关  利用软件模拟实现DEP 对操作系统提供一定的保护。

现在就知道了 SafeSEH的检验过程会检查异常处理函数是否处于非可执行上了吧。

2)硬件DEP其实才是真正意义上的DEP,需要CPU支持,(AMD 称之为NX     INTEL称之为XD)

操作系统通过设置内存夜的NX/XDsh属性标记,来指明不能从该内存执行代码。 标志0 ---该页面可以运行

OPTIN: 默认将DEP保护应用于 WINODWS 系统组件 和 服务

OPTOUT 为排除列表程序外的所有程序和服务启用DEP,也就是指定程序部启用DEP 默认无

ALWAYSON 对所有进程启用DEP的保护  目前只有64位操作系统   64位总是开启 不可以被关闭  IE是32位程序

ALWAYSOFF 对所有进程都禁用DEP


解决方法  总结:

1  覆盖SEH 去关闭DEP     SEH上放置 pop pop pop esp ret   nseh 放置关闭NX例程 

暂无例子说明····

0BADF00D   * pdep [-r <reg>] [-m <module>] [-n] [-o]
0BADF00D                                  (look for dep bypass instructions such as pop pop pop esp ret)
0BADF00D                                   You can optionally specify reg and module to filter on
0BADF00D                                   Option -n : don't show pointers that contain null bytes
0BADF00D                                   Option -o : don't show pointers from modules in the Windows folder
2  覆盖返回地址    strcpy 对shellcode字符要检查x00
Ret2Libc学习NtSetInformationProcess DEP

3  覆盖返回地址   memcpy 对shellcode字符串无检查

Ret2libc 利用 VitualProtect

Ret2libc 利用 VirtualAlloc

VirtualProtect 2方法 -direct ret-dep-easy rm to mp3

利用可执行内存 实现  将代码复制进其中执行  暂无例子


下面可以进行选择 OPTIN 和 OPTOUT


还可以这样查看


在VS2008中看到  默认启用DEP的



还有在PE文件视角下      IMAGE_OPTIONAL_HEADER中的DllCharacteristics变量进行体现当它设置成为0x0100表示该程序采用 /NXCOMPAT 编译

VISTA 及后续版本的操作系统上会自动启用 DEP保护

这种保护石迄今为止  在本书中 我们遇得到的最有力保护机制

保护局限:

1)硬件CPU需要CPU支持,不是所有CPU都支持硬件DEP的支持

2)由于兼容性的原因  WINDOWS不能对所有的进程开启 DEP保护,否则可能出现异常

ATL,Active Template Library活动模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。

EG: 一些第三方插件DLL   由于无法确认其是否支持DEP  对涉及一些DLL的程序不敢贸然开启DEP保护  .ATL7.1 + 以前版本的程序需要在数据页面上产生可执行代码,这种情况不能开启    DEP保护的

3)/NXCOMPAT  编译选项  或者是 IMAGE_DLLCHARACTERISTICS_NX_COMPAT的设置,只对VISTA 以上的系统有效

       EG:   在XP SP3  等  这个设置会被忽略

4)早期的系统   有动态关闭DEP的   API函数     


64位下   有 ALWAYSON  对所有进程启用DEP保护,在这个模式下,DEP不可以被关闭  目前64位操作系统上才工作在  ALWAYSON模式下

ALWATSOFF 对所有进程禁用DEP


DEP保护对象是进程级别的,当加载模块的只要有一个模块不支持DEP,这个进程就不能贸然开启DEP,否则产生异常

即使是WIN7下依然有很多程序没有启用DEP 想办法攻击未启用DEP保护的程序不失为一个简单有效的方法


从 Windows XP SP2 开始,Windows 的 32 位版本使用下列功能之一:

  • 由 AMD 定义的 No-Execute Page-Protection (NX) 处理器功能。
  • 由 Intel 定义的 Execute Disable Bit (XD) 功能。


在Vista / wnodws 2008 / windows 7 可以用 bcdedit 命令来修改设置

BCDEdit(启动配置数据存储编辑器)命令用于修改Win7/Win8启动菜单,相对于WinXP等之前的系统是通过修改Boot.ini文件来实现对系统启动菜单的修改

bcdedit /set nx OptIn

bcdedit /set nx OptOut

bcdedit /set nx AlwaysOn

bcdedit /set nx AlwaysOff


bcdedit  可以查看当前 NX 的值



      WriteProcessMemory 函数 可以写入 oleaut32.dll 这个区间为 R E  有一个问题,就是  WPM 调用会暂时把这个位置标记为可读,

那么你用编码的 shellcode 将不会成功,坏字节也不会成功的,可以预先考虑在真正的shellcode 里面包含一些小  egghunter , 会调用

VirtualProtect 去设置可读可写

       WPM 2  可以直接去写 WriteProcessMemory 函数中的 ZwWriteVirtualMemory 之后的位置,那么可以直接执行,但是要考虑 不会破坏kernel32.dll

的结构,因为shellcode 要用到kernel32.dll中的函数。所以要注意shellcode的大小限制




 Message=ROP Chain for VirtualProtect() [(XP/2003 Server and up)] :


 Message=ROP Chain for SetInformationProcess() [(XP/2003 Server only)] :


 Message=ROP Chain for SetProcessDEPPolicy() [(XP SP3/Vista SP1/2008 Server SP1, can be called only once per process)] :


 Message=ROP Chain for VirtualAlloc() [(XP/2003 Server and up)] :

!mona rop 可以查询 有关ROP的信息


!pvefindaddr ropcall   查看无 ASLR SAFESEH 供逃过DEP 的函数调用



发现了WIN7 不同系统中的DLL 基址 与函数的差是不变的,那么各个 retn 的地址差也是不变的,那么构造ROP就很简单了。


















原文地址:https://www.cnblogs.com/zcc1414/p/3982492.html