溢出攻击的根源在于现代计算机对数据和代码没有明确区分,就目前来看重新去设计计算机体系结构基本上不可能,只能靠向前兼容的修补来减少溢出带来的损害,DEP(数据执行保护,Data Execution Prevention)就是用来弥补计算机对数据和代码混淆这一天然缺陷的。
DEP的基本原理就是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。如下图所示:
DEP的主要作用是阻止数据页(如默认的堆页、各种堆栈页以及内存池页)执行代码。
微软从Windows XP SP2开始提供这种技术支持,根据实现的机制不同可分为:软件DEP(software DEP)和硬件DEP(hardware-enforced DEP).
- 软件DEP其实就是我们之前介绍的SafeSEH,它的目的就是阻止利用S.E.H的攻击,这种机制与CPU硬件无关,Windows利用软件模拟实现DEP,对操作系统提供一定的保护。
- 硬件DEP才是真正意义上的DEP,硬件DEP需要CPU的支持,AMD和intel都为此做了设计,AMD称之为No-Execute Page-Protection(NX),intel称之为Execute Disable Bit(XD)。二者原理和功能在本质上相同。
操作系统通过设置内存页的NX/XD属性标记,来指明不能从该内存执行代码。为了实现这个功能,需要在内存的页面表(Page Table)中加入一个特殊的标识位(NX/XD)来标识是否允许在该页上执行指令。当该标识位设置为0时,表示这个页面允许执行指令;设置为1时,表示该页面不允许执行指令。
由于软件DEP就是传说中的SafeSEH,这节主要对硬件DEP进行讨论与分析。
检擦CPU是否支持硬件DEP:
单击“我的电脑”——“属性”——在打开的“系统属性”窗口中点击“高级”选项卡。在“高级”选项卡页面中的“性能”下单击“设置”打开“性能选项”页。单击“数据执行保护”选项卡,在该页中我们可以确定计算机的CPU是否支持DEP。如果CPU不支持硬件DEP,该页面底部会有如下类似提示:“您的计算机的处理器不支持基于硬件的DEP。但是,windows可以使用DEP软件帮助保护免受某些类型的攻击”。如下图所示:
根据启动参数的不同,DEP工作状态可以分为四种:
- Optin:默认仅将DEP保护应用于windows系统组件和服务,对其他程序不予保护,单用户可以通过应用程序兼容性工具(ACT)为选定的程序启用DEP。多用于普通用户版的操作系统,如windows XP、windows vista、windows7.
- Optout:为排除列表程序外的所有程序和服务启用DEP,用户可以手动在排除列表中指定不启用DEP保护的程序和服务。它多作用于服务器版的操作系统,如Windows 2003、windows 2008。
- AlwaysOn:对所有进程启用DEP保护,不存在排序列表,在这种模式下,DEP不可以被关闭,目前只有在64位的操作系统上才工作在该模式下。
- AlwaysOff:对所有进程都禁用DEP,在这种模式下,DEP不能被动态开启,这种模式一般只有在某种特定场合下才使用,如DEP干扰到程序的正常运行。
切换上图的复选框,即可切换Optin和Optout两种模式。还可以通过修改c:\boot.ini中的/noexecute启动值来控制DEP的工作模式。

和DEP密切相关的程序链接选项:/NXCOMPAT。/NXCOMPAT是VS2005及其后续版本引入的一个编译选项,默认开启。
在VS2008中,可以通过菜单中的project—project properties—configuration properties—linker—advanced—data execution prevention(DEP)中选择是不是使用/NXCOMPAT编译程序。如下图所示:
采用/NXCOMPAT编译的程序在文件的PE头中设置IMAGE_DLLCHARACTERISTICS_NX
_COMPAT标识,该标识通过结构体IMAGE_OPTIONAL_HEADER中的DllCharacteristics变量进行体现,当DllCharacteristics设置为0x0100表示该程序采用了/NXCOMPAT编译。
经过/NXCOMPAT编译的程序有什么好处?用户版的操作系统中DEP一般工作在Optin状态,此时DEP只保护系统核心进程,而对于普通的程序是没有保护的。经过/NXCOMPAT编译的程序在windows vista及后续版本的操作系统上会自动启用DEP保护。
DEP也有其自身的局限性:
- 硬件DEP需要CPU的支持,但不是所有CPU都提供了硬件DEP的支持,在一些比较老的CPU上DEP是无法发挥作用的;
- 由于兼容性的原因,windows不能对所有进程开启DEP保护,否则可能会出现异常;
- /NXCOMPAT编译选项,或者IMAGE_DLLCHARACTERISTICS_NX_COMPAT设置,只对windows vista以上的系统有效。在以前的系统上,如windows xp sp3等,这个设置会被忽略;
- 当DEP工作在最重要的两种状态Optin和Optout下时,DEP是可以被动态关闭和开启的,这就说明操作系统提供了某些API函数来控制DEP的状态。