缓冲区溢出与数据执行保护DEP介绍

先看一个缓冲区溢出的C++实例程序,代码如下(VC6.0下编译通过):


//by MoreWindows
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>void foo(const char *input)
{char buf[4]; //buf 占4字节,后4字节为ebp,再后4个字节为返回地址。strcpy(buf, input); //传入的字符串去覆盖返回地址,从而使用程序执行bar()函数
}void bar(void)
{printf("Augh! This program have been hacked by MoreWindows!\n");getch();exit(0);//由于这时的ebp已经破坏了, 所以在这直接退出程序. 不然会弹出错误对话框
}int main(int argc, char *argv[])
{  printf("Address of main = %p\n", main);printf("Address of foo = %p\n", foo);printf("Address of bar = %p\n", bar); //构造字符串,前8个填充字符,再跟一个bar()函数的地址。char szbuf[50] = "12341234";DWORD *pbarAddress = (DWORD *)&szbuf[8];*pbarAddress = (DWORD)bar;foo(szbuf);return 0;
}

程序运行结果如下:

可以看出在程序中并没有调用bar()函数,只调用了foo()函数,但由于foo()函数处理不当,造成了缓冲区溢出后修改了foo()函数的返回地址从而导致程序执行本不应该执行的bar()函数。当然实际的溢出攻击远比这个例子要复杂的多,但原理相同,都是通过篡改函数的返回地址从而让程序执行不应该执行的代码。

数据执行保护DEP原理

分析缓冲区溢出攻击,其根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,就目前来看重新去设计计算机体系结构基本上是不可能的,我们只能靠向前兼容的修补来减少溢出带来的损害,数据执行保护DEP就是用来弥补计算机对数据和代码混淆这一天然缺陷的。

DEP的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时(注1),程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。如图1所示。

  图1 DEP工作原理

DEP的主要作用是阻止数据页(如默认的堆页、各种堆栈页以及内存池页)执行代码。微软从Windows XP SP2开始提供这种技术支持,根据实现的机制不同分为:软件DEP(Software DEP)和硬件DEP(Hardware-enforced DEP)。

软件DEP与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

  可以通过如下方法检查CPU是否支持硬件DEP,右键单击桌面上的"我的电脑"à"属性"à"高级"选项卡。在"高级"选项卡页面中的"性能"下单击"设置"打开"性能选项"页。单击"数据执行保护"选项卡,在该页面中我们可确认自己计算机的CPU是否支持DEP。如果CPU不支持硬件DEP该页面底部会有如下类似提示:"您的计算机的处理器不支持基于硬件的DEP。但是,Windows可以使用DEP软件帮助保护免受某些类型的攻击",如图2所示。

图2 Windows XP下DEP选项页示例

根据启动参数的不同,DEP工作状态可以分为四种:

(1)optin:默认仅将DEP保护应用于Windows系统组件和服务,对于其他程序不予保护,但用户可以通过应用程序兼容性工具(ACT,Application Compatibility Toolkit)为选定的程序启用DEP,在Vista下边经过/NXcompat选项编译过的程序将自动应用DEP.这种模式可以被应用程序动态关闭,它多用于普通用户版的操作系统,如Windows XP、Windows Vista、Windows7.

(2)optout:为排除列表程序外的所有程序和服务启用DEP,用户可以手动在排除列表中指定不启用DEP保护的程序和服务。这种模式可以被应用程序动态关闭,它多用于服务器版的操作系统,如 Windows Server 2003、Windows Server 2008.

(3)alwaysOn:对所有进程启用DEP 的保护,不存在排序列表,在这种模式下,DEP不可以被关闭,目前只有在64位的操作系统上才工作在AlwaysOn模式。

(4)alwaysOff:对所有进程都禁用DEP,这种模式下,DEP也不能被动态开启,这种模式一般只有在某种特定场合才使用,如DEP干扰到程序的正常运行。

可以通过切换图2中的复选框切换Optin和Optout两种模式。还可以通过修改c:boot.ini中的/noexecute启动项的值来控制DEP的工作模式。如图3所示,DEP在XP操作系统上的工作模式为optin。

  图3 Windows XP下DEP的默认启动状态

在编程中使用数据执行保护DEP

介绍完DEP的工作原理及状态后,我们来看一个和DEP密切相关的程序链接选项:/NXCOMPAT。/NXCOMPAT是Visual Studio 2005及后续版本中引入一个链接选项,默认情况下是开启的。使用的Visual Studio 2008(VS 9.0),可以在通过菜单中的“项目”->最下面的工程属性->“链接器”->“高级”就可以看到数据执行保护(DEP)了。如图4所示:

图4 VS 2008中设置/NXCOMPAT编译选项

因此如果你用VS2008去编译上面那个示例代码,程序运行遇到缓冲区溢出后不会执行bar()函数而是直接弹出个提示框,如图5所示:

图5 VS2008生成程序会自动防范缓冲区攻击

经过/NXCOMPAT编译的程序有什么好处呢?通过前面的介绍我们知道用户版的操作系统中DEP一般工作在optin状态,此时DEP只保护系统核心进程,而对于普通的程序是没有保护的。虽然用户可以通过工具自行添加,但这无形中增高了安全的门槛,所以微软推出了/NXCOMPAT编译选项。经过/NXCOMPAT编译的程序在Windows Vista及后续版本的操作系统上会自动启用DEP保护。由此可见在编程中利用数据执行保护来加强程序的安全性是一件非常容易的事情。

DEP的不足之处

DEP针对溢出攻击的本源,完善了内存管理机制。通过将内存页设置为不可执行状态,来阻止堆栈中shellcode的执行,这种釜底抽薪的机制给缓冲溢出带来了前所未有的挑战。这也是迄今为止我们遇到的最有力的保护机制,它能够彻底阻止缓冲区溢出攻击么?答案是否定的。如同前面介绍的安全机制一样,DEP也有着自身的局限性:

首先,硬件DEP需要CPU的支持,但并不是所有的CPU都提供了硬件DEP的支持,在一些比较老的CPU上面DEP是无法发挥作用的。

其次,由于兼容性的原因Windows不能对所有进程开启DEP保护,否则可能会出现异常。例如一些第三方的插件DLL,由于无法确认其是否支持DEP,对涉及这些DLL的程序不敢贸然开启DEP保护。再有就是使用ATL 7.1或者以前版本的程序需要在数据页面上产生可以执行代码,这种情况就不能开启DEP保护,否则程序会出现异常。

再次,/NXCOMPAT编译选项,或者是IMAGE_DLLCHARACTERISTICS_NX_COMPAT的设置,只对Windows Vista 以上的系统有效。在以前的系统上,如Windows XP SP3等,这个设置会被忽略。也就是说,即使采用了该链接选项的程序在一些操作系统上也不会自动启用DEP保护。

最后,当DEP工作在最主要的两种状态optin和optout下时,DEP是可以被动态关闭和开启的,这就说明操作系统提供了某些API函数来控制DEP的状态。同样很不幸的是早期的操作系统中对这些API函数的调用没有任何限制,所有的进程都可以调用这些API函数,这就埋下了很大的安全隐患,也为突破DEP的攻击者提供了一条道路。

注1.    Shellcode指的是一段用来发送到服务器利用特定漏洞的代码(也可以是填充数据),一般用于获取权限。另外,Shellcode通常是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心。

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6887136

Windows 缓冲区溢出与数据执行保护DEP相关推荐

  1. 关闭数据执行保护(DEP)

    数据执行保护 =  DEP = Data Excute Protection 1.Windows XP下关闭 在桌面"我的电脑"点击鼠标左键--属性--高级--性能设置选项 2.V ...

  2. 彻底关闭数据执行保护(DEP)

    彻底关闭数据执行保护(DEP) 1.直接修改Boot.ini文件(彻底关闭数据执行保护DEP)  在WinXP SP2系统所在分区根目录下找到Boot.ini文件(需打开系统隐藏文件及受保护的系统隐藏 ...

  3. 计算机打数据执行保护删除不掉,运行某应用程序时,出现数据执行保护 (DEP)提示的解决方案...

    原因分析: 数据执行保护技术(Data Execution Prevention,以下简称 DEP)是 Windows XP SP2和 Windows 2003 SP1新增的一项功能.DEP 简单地说 ...

  4. DLL/OCX文件的注册与数据执行保护DEP

    注册/反注册dll或ocx文件时,无论是用regsvr32还是DllRegisterServer/DllUnregisterServer,可能会遇到[内存位置访问无效]的问题: 此时把操作系统的数据执 ...

  5. 如何关闭Windows XP/Vista/Windows 7的DEP数据执行保护

    数据执行保护 (DEP) 是一种Windows安全机制,从Windows版本顺序上看是从Windows XP SP2开始引入,通过监视程序以确保它们使用的系统内存是安全的,帮助防止操作系统受到病毒和其 ...

  6. 如何关闭VS的DEP保护(数据执行保护)

    今天看到0day安全中栈溢出的示例,手痒就学习,程序在一波 函数中修改函数返回地址跳到栈区去执行代码,而在DEP保护开启情况下堆和栈是无法执行代码,这也是缓冲区溢出保护机制之一. 在一番太头疼之后终于 ...

  7. 计算机系统保护怎么打开,Win7系统开启DEP数据执行保护的具体方法

    大部分用户都不知道数据执行保护 (DEP)有什么作用, DEP数据执行保护有助于防止我们的计算机遭受病毒的侵害,也有助于防止其他安全威胁危害我们的计算机.Win7专业版系统默认没有开启DEP数据执行保 ...

  8. 数据执行保护(DEP)的基本设置

    1)执行权限 必须是管理员,而且可以修改boot.ini文件 2)数据执行保护DEP的几个可选参数    NOExecute=Optin (为关键Windows程序和服务启用数据执行保护)    NO ...

  9. 关于Windows 7下的DEP(数据执行保护)

    注:本文版权归IT专家网所有,未经授权请勿转载! DEP(Data Execution Prevention)即"数据执行保护",这是Windows的一项安全机制,主要用来防止病毒 ...

  10. 如何解决经常出现Windows数据执行保护的提示?

    方法一:  关闭数据保护,编辑Boot.ini文件,将/NoExecute=OptIn 改为/NoExecute=AlwaysOff.  要编辑Boot.ini,请在开始中我的电脑上点右键-属性-高级 ...

最新文章

  1. IBM X3550 RAID 扩容实例
  2. #20155235 《网络攻防》 实验二 后门原理与实践
  3. Qt 设置窗口背景图片的几种方法
  4. pythonpip安装与使用_Python pip 安装使用与问题
  5. 计算机二级考试C++考试大纲
  6. 以太网接口MII,RMII,SMII,GMII总线接口简介
  7. Java虚拟机-垃圾回收器
  8. 配置classpath,引入jar包
  9. Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系
  10. 17家新创 组物联网国家队
  11. .php on line 0,控制台运行php报错 undefined symbol: gdImageCreateFromJpeg in Unknown on line 0 解决方法...
  12. ospf 指定dr_OSPF的基本配置及DR /BDR选举的实验
  13. java源码-AtomicInteger
  14. 深度学习笔记(三):激活函数和损失函数
  15. Python求极限求积分,编程实现
  16. Ubuntu 重置用户密码
  17. 全球与中国电力系统同步时钟市场深度研究分析报告
  18. latex 定理环境,引理,定义,自定义 proof 环境
  19. QBitmap 单色图片
  20. Holt 线性趋势模型,指数趋势模型和阻尼形式

热门文章

  1. Mybatis学习笔记(二)
  2. HPU 1725: 感恩节KK专场——特殊的比赛日期【水】
  3. 我的世界光影mod怎么用_国际版minecraft mod和光影教程
  4. Android开启双摄像头
  5. 双摄像头实时视频拼接(平移模型)
  6. QT之如何添加现有文件
  7. 计算机到点就有音乐怎么清除缓存垃圾,QQ音乐缓存文件在哪 QQ音乐缓存清理方法-电脑教程...
  8. Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie
  9. java 立体几何体中心点_高中数学知识点大全,立体几何核心考点及解题技巧
  10. ArcGIS Runtime API for Android100.13.0加载TPK包、Runtime包、WMS地图服务、三维模式