转移自之前的博客

NX保护和DEP保护

两个保护措施都有相同点,都是使数据与代码分离,防止恶意代码被执行简单来说就是关闭了堆栈执行权限

NX保护

NX保护,全称为 “No eXecute” ,意为 [禁止执行]
我对它的理解即为栈上数据区域去除执行权限,就能防止大多数溢出攻击,即一些恶意程式,把自身的恶意指令集放在其他程式的数据储存区并执行。

linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法。那就是只有栈是不可执行,而除了栈以外的其他地方还是可以执行的,只要把返回地址执行别的地方就可以。

DEP保护

DEP保护,全称为 Data Execution Prevention ,意为 数据执行保护

数据执行保护(DEP) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码

主要优点
我觉得这种保护技术组要应用于Windows

这种技术的保护方式和NX方式有相同的地方,也就是让堆和堆栈上的内容不可执行。 可帮助防止数据页当作代码执行,从而有效分离数据与代码。可写的不可执行,可执行的不可写。
百度百科上有这样一句话:

可以说,溢出是操作系统(应用软件)永远的痛,Windows 7自然也不例外。所谓溢出主要指缓冲区溢出,就是利用系统(应用软件)漏洞从只有Windows和其他程序可以使用的内存位置执行恶意代码从而达到控制系统的目的。如前所述,缓冲区溢出攻击经常在其它程序的内存缓冲区写入可执行的恶意代码,然后诱骗程序执行恶意代码。使用DEP的目的是阻止恶意插入代码的执行,其运行机制是,Windows利用DEP标记只包含数据的内存位置为非可执行(NX),当应用程序试图从标记为NX的内存位置执行代码时,Windows的DEP逻辑将阻止应用程序这样做,从而达到保护系统防止溢出。

*P.S.好像这部分还分为硬件实施DEP和软件实施DEP,这个坑先留着吧,过些日子理解之后我再来填。

Linux Canary保护

Canary ,又名 金丝雀 ,是一个防止溢出修改ret的措施, Canary 是Linux众多安全保护机制中的一种,主要用于 防护栈溢出攻击 。我们知道,在32位系统上,对于栈溢出漏洞,攻击者通常是通过 溢出栈缓冲区 , 覆盖栈上保存的函数返回地址 来达到 劫持程序执行流 的目的:
溢出栈缓冲区
劫持方式

1

1

如上图所示我们只要能够精确计算出需要覆盖的长度是多少,就能精确覆盖ret的地址,达到攻击效果。
然而,针对此种攻击情况,如果在函数返回之前,我们能够判断ret地址是否被改写,若被改写则终止程序的执行,便可以有效地应对攻击。如何做到呢?一个很自然的想法是在刚进入函数时,在栈上放置一个标志,在函数结束时,判断该标志是否被改变,如果被改变,则表示有攻击行为发生。 Linux Canary保护机制 便是如此,如下:

1

1

攻击者如果要通过栈溢出覆盖ret,则必先覆盖Canary。如果我们能判断Canary前后是否一致,便能够判断是否有攻击行为发生。

注:上述图例仅用于说明,实际上canary并不一定是与栈上保存的BP地址相邻的。

ASLR地址空间布局随机化

ASLR ,全称为 Address space layout randomization
顾名思义,这个保护措施的主要内容就是把地址给随机化了,用以增加攻击者对地址预测的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。

但是这个措施只是能降低缓冲区溢出攻击的成功率,并不是能完全防止溢出。

关于这个,多的我也说不上来,给几个文章的地址吧。

PIE

PIE ,全称为 position-independent executables
一般情况下NX和地址空间分布随机化会同时工作。在linux下内存空间随机化被称作PIE。

内存地址随机化机制,有以下三种情况:

1
2
3
4
参数 意义
0 表示关闭进程地址空间随机化
1 表示将mmap的基址,stack和vdso页面随机化
2 表示在1的基础上增加栈(heap)的随机化

可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。
Built as PIE:位置独立的可执行区域(position-independent executables)。这样使得在利用缓冲溢出和移动操作系统中存在的其他内存崩溃缺陷时采用面向返回的编程(return-oriented programming)方法变得难得多。

FORTIFY

这个好像是编译器的保护措施,将函数名改变了,从而达到防止缓冲区溢出的作用。具体的坑emmm等我以后学会了些再来填吧。

系统防护(全):
二进制的保护机制
WINDOWS和LINUX的内存防护机制