1.Security Cookie
- 在函数调用发生时,向栈帧内压入一个额外的随机 DWORD,这个随机数被称做Security Cookie
- Security Cookie 位于 EBP 之前, 系统还将在.data的内存区域中存放一个 Security Cookie的副本
- 在函数返回之前,系统将执行一个额外的安全验证操作,被称做 Security check
- 在 Security Check 的过程中,系统将比较栈帧中原先存放的 Security Co okie 和.data 中副本的值,如果两者不吻合,说明栈帧中的 Security Cookie 已被破坏,即栈中发生了溢出
- 当检测到栈中发生溢出时,系统将进入异常处理流程,函数不会被正常返回, ret 指令也不会被执行
2.DEP:Data Execution Prevention
溢出攻击的根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,DEP(数据执行保护, Data Execution Prevention)就是用来弥补计算机对数据和代码混淆这一天然缺陷的。
DEP 的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入 shellcode 时,程序会尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。
ROP的全称为Return-oriented Programming,主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。
3.ASLR:地址随机化
无论是 JMP ESP 等通用跳板指令还是 ROP使用的各指令,我们都要先确定这条指令的入口点。
ASLR( Address Space Layout Randomization)技术就是通过加载程序的时候不再使用固定的基址加载,从而干扰 shellcode 定位的一种保护机制。
a.映像随机化
映像随机化是在 PE 文件映射到内存时,对其加载的虚拟地址进行随机化处理,这个地址是在系统启动时确定的,系统重启后这个地址会变化。
b.堆栈随机化
在程序运行时随机的选择堆栈的基址,与映像基址随机化不同的是堆栈的基址不是在系统启动的时候确定的,而是在打开程序的时候确定的,也就是说同一个程序任意两次运行时的堆栈基址都是不同的,进而各变量在内存中的位置也就是不确定的。
c.PEB 与 TEB 随机化
PEB 与 TEB 随机化在 Windows XP SP2 中就已经引入了,微软在 XP SP2 之后不再使用固定的 PEB 基址 0x7FFDF000 和 TEB 基址 0x7FFDE000,而是使用具有一定随机性的基址,这就增加了攻击 PEB 中的函数指针的难度。
Heap sp ray 本来就是为了应对堆空间随机分配的问题产生的, ASLR 本质也是随机化处理,所以直接使用 Heap spray 绕过 ASLR 也是可能的。
网友评论