写在前面:
本篇博客为本人原创,但非首发,首发在先知社区
原文链接:
https://xz.aliyun.com/t/13855?time__1311=mqmxnQG%3DKDu7D%2F7iiQGkAmpoxIEVmYD&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fu%2F74789
各位师傅有兴趣的话也可以去先知社区个人主页逛逛(个人昵称:Shad0w_2023)。
在开始DEP保护机制的介绍之前,想一想没有开保护时我们的攻击过程,以及开了我们前面介绍的GS和SafeSEH保护的攻击过程,相信大家都能发现一个问题:就是我们本来写入数据区的数据被当作代码执行了,那么站在一个开发者的角度,我们该如何避免这种问题?
一.DEP保护机制详解
我们溢出攻击的根源就是现代计算机对代码和数据没有做明确的区分导致存储在数据区的数据被当作代码执行,而DEP保护机制,就是来弥补计算机这个缺陷的。
DEP将内存中的代码区和数据区明确区分开来,阻止数据页(如默认的堆页,各种堆栈页以及内存池页)执行代码,当指令指针指向数据区的时候,就会抛出异常。微软从Windows XP SP2就开始支持这种技术了。
关于段页保护机制,可以看看大佬写的这篇文章:操作系统学习 — 启动操作系统:进入保护模式
而根据实现的机制不同,可以分为软件DEP和硬件DEP。
- 软件DEP
软件DEP实际上就是我们前面介绍的SafeSEH,大家回想一下,是不是阻止数据区代码执行?它的目的是阻止利用SEH的攻击。 - 硬件DEP
可以说硬件DEP才是真正的DEP,硬件DEP需要CPU的支持,AMD和Intel都为此做了设计,AMD称之为No-Execute Page-Protection(NX),Intel称之为Execute Disable Bit(XD),两者的工作原理实际上都在本质上相同。
由于软件DEP我们前面已经介绍过了,在这篇文章中我们就来着重介绍一下硬件DEP。<