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

安全编码实践四:C/C++中禁用危险API  《程序员》9月文章 申明。文章仅代表个人观点,与所在公司无任何联系。概述    在前面的安全编码实践的文章里,我们讨论了GS编译选项,数据执行保护DEP功能,以及静态代码分析工具Prefast。这里,我们讨论在C/C++代码中禁用危险的API,其主要目的是为了减少代码中引入安全漏洞的可能性。那些是危险的API 2.1历史   在微软产品的安全漏洞中,有很大 阅读详情
 

缓冲区溢出与数据执行保护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.youkuaiyun.com/morewindows/article/details/6887136



        
利用正射影像对斜射图像进行反向投影 因此,RANSAC算法可以通过计算inliners和outliers的数量来评估估计关键点的质量,确保与其他点不一致的点不会在Homography矩阵中被估计。然后,它通过考虑关键点周围区域中图像的梯度大小和方向来计算每个提取的关键点的方向。由于单应性矩阵的计算可能会受到两个图像中异常值的存在的影响,这将导致矩阵的不正确估计并导致沿图像的对准和映射不良。FLANN匹配器的方法基于K近邻搜索的概念,即从图像中找到k个近邻。找到相机在正射影像坐标系中的位置并在正射影像上绘制重叠区域的边界框。 阅读详情

相关推荐

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2923

【网络安全】brainpan-windows缓冲区溢出详解

渗透测试注意本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。

m0_59598029的博客 757

BRep实战指南:从理论到文件格式的全面解析

本文全面解析BRep(边界表示法)从基础概念到文件格式的实战应用。详细介绍了BRep的数学定义、工业应用场景,以及STEP、IGES等主流文件格式的对比与使用技巧,帮助读者掌握三维建模核心技术并优化性能。

weixin_29235923的博客 407

设置: SystemSettings.exe - 系统错误+缓冲区溢出 解决方法

设置: SystemSettings.exe - 系统错误。 解决方法:设置以下服务项自启动。 WpnService 自启动 WpnUserService自启动

Vanwise的博客 2万+

tesseract-ocr的字库学习步骤(训练自己的文库),关于ocr的对图片的解析,包括tesseract的安装(史上最全)

tesseract-ocr的字库学习步骤(训练自己的文库) 简介:在网上看了很多案列。都不是很完整。然后自己用了一天时间进行整理,第一次写文章,希望对大家有帮助。 一、安装tesseract 下载地址https://github.com/UB-Mannheim/tesseract/wiki 1.点击下面下载的这个进行运行(安装的时候有点慢) 2.点击next 3.I accept the terms of the License Agreement前的复选框打勾,点击Next。 4.Install f

HAC12的博客 2229

用FPGA控制步进电机是种什么体验?从状态机到分频器,详解Verilog驱动A4988全流程

本文详细介绍了如何使用FPGA通过Verilog语言控制步进电机,从状态机设计到A4988驱动模块的精准控制全流程。FPGA的并行处理能力和纳秒级响应速度使其在步进电机控制中展现出显著优势,特别适合工业自动化和精密仪器应用。通过实战代码示例,展示了如何实现高效的状态机设计和可编程分频器,为开发者提供了一套完整的FPGA驱动步进电机解决方案。

weixin_30983965的博客 329

【windows折腾日记】解决电脑提示系统错误弹窗:系统在此应用程序中检测到基于堆栈的缓冲区溢出

解决电脑提示系统错误弹窗:系统在此应用程序中检测到基于堆栈的缓冲区溢出 这个问题我也碰到过,其时很容易解决 按下面的操作步骤,就可以解决这个问题~ 步骤: 1,按下键盘Win+R键,打开运行 2,输入 msconfig ,点击确定 3,在启动选择中,选择 正常启动 ,点击应用 ,在点击 确定 即可。 ...

u010560236的博客 14万+

深度学习笔记(3)——kernel(内核)与filter(滤波器)

本文仅仅简单介绍了kernel和filter的概念,介绍了确定filter和kernel个数的方法。

cs111211的博客 7135

堆栈溢出基础教程

这一讲我们来看看windows系统下的程序。我们的目的是研究如何利用windows程序的堆栈溢出漏洞。首先,我们来写一个问题程序:#include int main(){char name[32];gets(name);for(int i=0;iprintf("//0x%x",name[i]);}相信大家都看出来了,gets(name)对name数组没有作边界检查。那么我们可以给程序一个很长的串,

|游梦空间| 1545

C#版OpenCV:OpenCVSharp 最详细最全面教程(万字详细总结)

OpenCVSharp 是一个用于 .NET 环境的 OpenCV 包装库,它提供了一种简便的方法来利用 OpenCV 的功能进行图像和视频处理。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,最初由 Intel 研发并发布。OpenCVSharp 让 C# 和其他 .NET 语言的开发者可以方便地访问 OpenCV 的强大功能。// 打印 OpenCV 版本信息Cv2。

仰望星空的博客 2万+

Roboguide与TIA V16通讯

Roboguide与TIA V16通讯

haier123888的博客 2672

[转载]Windows 缓冲区溢出与数据执行保护DEP

原文地址:http://blog.youkuaiyun.com/morewindows/article/details/6887136 缓冲区溢出与数据执行保护DEP介绍 先看一个缓冲区溢出的C++实例程序,代码如下(VC6.0下编译通过): 1 #include <windows.h> 2 #include <conio.h> 3 #include <stdi...

weixin_30649641的博客 108

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

专业解决各种上架过包问题,专业团队专业处理 3187

数据执行保护讲解

2. **仅为基本Windows程序和服务启用DEP**:这种模式被称为“Option”,它只对Windows系统组件和服务启用DEP保护,而对其他第三方应用程序则不启用。1. **为所有程序和服务启用DEP**:这种模式被称为“AlwaysOn”,它为所有程序和服务启用了DEP保护,不允许任何程序从受保护的内存区域执行代码。相反,选择“仅为基本Windows程序和服务启用DEP”则仅对Windows系统组件和服务提供保护,这可以减少对第三方程序的干扰,但相应地降低了对某些潜在威胁的防护。

qw6r5的博客 2943

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

之前有一篇简单介绍C# 在开发过程中碰到WIN7系统设置的数据执行保护DEP的拦截,只是简单的介绍了解决的办法,前天忽然看到以下这篇文章介绍很详细,特转载。 先看一个缓冲区溢出的C++实例程序,代码如下(VC6.0下编译通过): [cpp]view plaincopy //byMoreWindows #include #include #include #...

biyusr的专栏 1072

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

DEP(Data Execution Prevention)即“数据执行保护”,这是Windows的一项安全机制,主要用来防止病毒和其他安全威胁对系统造成破坏。微软从Windows XP SP2引入了该技术,并一直延续到此后的Windows Server 2003、Windows Server 2008中。毫无例外,在Windows 7中D...

weixin_33895516的博客 1267

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【转】在Windows Server 2003中提示Can't load package:dclite70.bpl解决方法

右击“我的电脑”。单击“属性”。在“系统属性”中单击“高级”。在“性能”中单击“设置”。在“性能选项”中单击“数据执行保护”。单击“添加”。选择Delphi7安装目录,然后到Bin目录下选择Delphi32.exe。应用重启DELPHI即可。全是Window2003的Data Execution Prevention(DEF数据执行保护)造成的。 引用数据执行保护 (DEP) 是 Mi

拓 484

gdb 查看是否 栈溢出_ASLR、DEP与栈保护(HFUT-ZRB's Task)

任务2:ASLR、DEP与栈保护一、任务内容①查阅资料,了解地址空间布局随机化(Address Space Layout Randomization,ASLR)的原理和作用。②在Windows操作系统中,基于VC 6编写、编译包含简单自定义函数func( )调用的控制台小程序,利用反编译结果或调试跟踪分析func( )的调用与地址;基于VS C++编译上述同一代码,并分析func( )的调用与地址...

weixin_39692623的博客 1166

windows系统上使用VS编译器时对缓冲区溢出的防范措施

0x01 /GS --缓冲区安全性检查 如果使用/GS进行编译,将在程序中插入代码,以检测可能覆盖函数返回地址的缓冲区溢出。如果发生了缓冲区溢出,系统将向用户显示一个警告对话框,然后终止程序。这样,攻击者将无法控制应用程序。用户也可以编写自定义的错误处理例程,以代替默认对话框来处理错误。 在返回地址之前将插入一个专门的 cookie(系列字节),以使得任何缓冲区溢出都将更改该cooki

qq51931373的专栏 2098

Windows Internals学习:数据执行保护(Data Execution Prevention,DEP)详解

先想象一种常见的攻击手法:很多安全漏洞(比如缓冲区溢出)的核心思路,是攻击者想办法把一段恶意代码,偷偷塞进本来只该存放"数据"的内存区域里——比如线程的栈(stack)——然后再通过某种手段,让 CPU 跳转过去执行这段被塞进去的"数据",把它当成代码来运行。这类攻击之所以能成功,根本原因在于传统的内存管理并不区分"这块内存是用来存数据的"还是"这块内存是用来存可执行代码的",只要 CPU 能读到指令,它就会老老实实地执行。 数据执行保护(Data Execution Prevention,简称 DEP),

虾球 361

Windows Server 2003 下 Delphi 提示无法加载 dclite70.bpl 的问题

Windows Server 2003 下 Delphi 提示无法加载 dclite70.bpl 的问题提示Cant load package:dclite70.bpl解决方法,win2003server SP1 + delphi7 ,在启动DELPHI时会提示Cant load package:dclite70.bpl,进入后打开Options时出现异常。解决方法:右击

1850

【安全健行】(6):Windows漏洞保护机制

2015/5/21 11:07:55之前我们一直在Linux平台上分析漏洞,那是因为对于绝大多数Hacker获得一个Linux平台更加容易,而且主流的服务器系统基本也都是Linux/Unix的;另外一个好处就是Linux提供了用户自定义的强大功能,我们可以根据需要编译汇编程序代码,关闭相应的安全保护机制,便于我们的研究学习。然而现实中有影响力的漏洞大多是基于Windows系统...

weixin_33806509的博客 556
上一篇: C# 访问数据库
下一篇: STL系列之一 deque双向队列
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值