绕过GS的栈溢出攻击原理

GS安全编译选项保护原理

针对缓冲区溢出时覆盖函数返回地址这一特征, 微软在 VS 7.0及以后的VS版本中默认启用了GS安全编译选项,其基本原理如下:

Security Cookie 产生细节:

以下情况不会应用GS:

绕过GS的几种攻击方法

1. 利用未被保护的内存突破GS

​ 系统为了将GS对性能的影响降到最小, 并不是所有的函数都会保护. 例如, 一个函数中不包含4字节以上的缓冲区时, 即使GS处于开启状态, 这个函数也是不受保护的. 因此, 可以针对这类函数, 构造巧妙的shellcode进行溢出.

2. 攻击异常处理突破GS

​ GS机制没有对SEH 提供保护, 因此可以通过攻击程序的异常处理机制达到绕过GS的目的. 通过构造超长的字符串覆盖掉异常处理指针, 然后触发一个异常, 程序就会转入异常处理; 由于异常处理指针已被覆盖, 因此可以通过劫持SEH来控制程序的后续流程.

3. 覆盖虚函数突破GS

​ 程序只有在函数返回时, 才会去检查Security Cookie,而我们在程序检查Security Cookie之前劫持程序流程的话,就可以实现对程序的溢出。例如使用C++的虚函数溢出即可实现上述功能.

4. 同时替换栈和.data中的Cookie突破GS

​ 若要在Security Cookie正常工作的情况下实现绕过, 由于Cookie 具有很强的随机性, 难以猜测, 所以只能同时替换栈和.data中的Cookie实现绕过. 构造特殊的shellcode使用相同的值覆盖栈和.data中的Cookie, 即可实现GS绕过.