-
-
[原创]Windows 安全机制---GS 尚未完结
-
-
[原创]Windows 安全机制---GS 尚未完结
GS功能是Windows 针对栈溢出而产生得防御技术。其主要原理是在调用函数初始化一个栈帧之后将一个随机数放入栈当中,并且在“.data“节区保存一个副本。每次在执行返回地址得指令之前都需要验证一下随机值。如果发生变化,则认为产生溢出。接下来,我们通过对比看看启动GS前后栈空间得变化。
测试环境:
测试代码:
注释:如何启动关闭GS功能如下图:
我们设定好之后,直接编译,发现代码在“__asm int 3”的位置断下来,接着我们查看“反汇编”窗口,如下代码。我们知道在断点之后的代码首先将字符串“qqqq”放入内存并且将对应的地址放入寄存器EAX当中压入栈。
我们步入进入函数vul()查看。如下汇编指令:
由上述代码,我们首先将vul() 函数分配得栈空间画出来,详细如下图:
注释:这里因为vul() 函数当中同样调用了strcpy_s()函数,所以同样会有对strcpy_s()函数得栈空间,这里不去讨论。
我们看到,在正常进行初始化一个栈空间的程序当中,插入了如下代码。由代码我们可以知道,首先会有一个初始的security_cookie值放入寄存器。
通过使用工具,我们发现初始值得地址在节区“.data”范围。详细如下图:
我们知道,在vul()函数返回得时候,会执行针对security_cookie得验证,接下来,我们来看看如下代码。首先将放入[ebp-4]位置得security_cookie值取出并且再次与当前得栈EBP值进行异或,并且将值放入ECX当中,之后调用验证函数。
接下来,我们步入验证函数,看看操作了什么,这里我们看如下代码,我们发现它将ECX,与“085a004h”地址得值进行对比。对比相同则执行ret指令,即跳转会之前vul()得栈空间,如果不相同值跳转到“0851b4bh”。这里我们注意地址“085a004h”得值就是初始得security_cookie。
在正常执行完初始化一个栈帧结束之后,会执行将“.data”节的第一个双字作为初始化cookie(具备随机性)。
然后使用初始化的种子cookie种子与当前的栈EBP进行异或运算,将值放入栈[ebp-4]的位置当中。
在函数返回之前,即执行ret指令之前,调用验证函数进行验证。
函数不包含缓冲区。
函数被定义为具有变量参数列表。
函数使用无保护的关键字标记。
函数在第一个语句众包含内嵌汇编代码。
缓冲区不是8字节类型且大小不大于4个字节。
利用未被保护的内存突破GS
覆盖虚函数突破GS
攻击异常处理突破GS
同时替换栈中和.data中的security_cookie突破GS
测试Shellcode:
注释:该Shellcode来自ioiojy讲师CVE实战课程
测试代码:
我们先思考一下,GS防护机制在函数返回的时候才会产生效果,而如果在不返回函数就劫持程序流是否就可以绕过了呢?虚函数就提供了这样的一次机会。
我们先执行代码,看看变量与虚表指针在栈中的布局。
首先,执行代码,代码会停止在int 3 得位置,映入眼帘的是如下汇编代码:
单步执行,进入a()函数当中,下面便是汇编代码
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-4-8 17:17
被天象独行编辑
,原因: