![](https://csdnimg.cn/release/download_crawler_static/14867384/bg3.jpg)
第 10 期 鲁婷婷等:Windows 内存防护机制研究 ·3·
00208-3
2 Windows 已部署的内存防护机制
随着缓冲区溢出漏洞利用的泛滥,微软在每
一次发布的 Windows系统中都引入新的内存保护
机制,这些机制成功阻扰了很多针对控制数据的
攻击,使 Windows 平台下能利用的漏洞大大减少。
然而每种机制都受限于特定条件,这给攻击者留
下了突破的机会。
2.1 GS 安全编译选项
微软在吸收 StackGuard
[14]
技术的思想上,独
立开发并在 Windows XP SP2 中引入 GS
[15]
编译技
术,在 visual studio 2003 及以后版本中默认启用
此编译选项。GS 编译选项为每个函数调用增加额
外数据 Security cookie 和安全校验操作,以检测
溢出攻击。在函数调用时,系统以.data 节中的第
一个双字作为 Security cookie 的种子,将其与函
数栈帧栈顶指针 ESP 异或后的结果压入栈中,作
为当前函数的 Security cookie;由于 Security
cookie 位于函数局部变量和函数返回地址之间,
当通过缓冲区溢出直接覆盖返回地址时,也会覆
盖 Security cookie;在函数返回时,系统执行安全
校验操作,将栈帧中的 Security cookie 还原并与
保存在.data 节中的 Security cookie 种子进行一致
性验证,若两者不一致,表明栈帧中的 Security
cookie 遭到破坏,发生了溢出攻击,立即进入异
常处理流程,反之函数正常返回。此过程如图 4
所示。
除加入 Security cookie 之外,微软在 visual
studio 2005 及后续版本中使用了 Variables reor-
dering
[16]
技术,将字符串变量移动到栈帧高地址,
同时在栈帧低地址存储指针类型和字符串类型参
数的副本,避免溢出破坏局部变量和函数参数。
此外,微软在 visual studio 2005 SP1 引入新的安
全标识#pragma strict_gs_check
[17]
,实现对不符合
GS 保护条件的函数添加保护。
尽管 GS 能够有效遏止直接修改返回地址的
溢出攻击,但其本身在设计上存在缺陷。一方面,
GS 只在函数返回时进行一致性验证,在此之前没
有任何的安全检查;另一方面,影响 GS 验证结
果的 Security cookie 种子保存在.data 节的固定位
置;此外,若定义了安全处理函数,其指针也将
存放在.data 节。因此大部分突破 GS 防护的技术
图 3 Windows 已部署的内存防护机制及非控制数据防护研究成果