本文主要是介绍GS编译选项是什么?为什么?怎么办?简单理解(security_cookie),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GS是什么
GS编译选项出现的目的,大部分原因是为了防止下面的情况而出
由于堆栈缓冲区溢出,导致代码的eip结构被更改,执行了未知的代码。
在微软的安全开发周期模型中,专门在安全编码实践中推荐:对于微软的最新C/C++编译器,使用GS选项编译选项,加入检测函数堆栈缓存溢出错误额外代码。
为什么是GS
GS怎么就能这么做,为什么是GS。
讲解原理这里需要一些对函数调用过程中堆栈变化的一些理解。就不再赘述。具体的自己跑一下就知道,这里只列出结果。
调用A函数时
按照数字的顺序依次压入栈。
// 当前函数栈空间//-----esp==ebp(当前) //然后把这个esp作为当前函数栈空间的ebp6.A函数内部局部变量5.异常处理代码入口地址 //如果A函数设置了异常处理4.安全cookie //如果编译器加GS选项3.ebp(上层)2.A函数下一跳指令地址 //返回地址1.调用A函数所需的参数-----ebp //上层函数的ebp(上层)
缓冲区溢出的原理简单来说就是填充6.A函数内部局部变量,一直往下填充,直到填充掉下一跳指令地址(EIP),这样函数返回后,跳转到的就是指定的代码区域执行。从而执行恶意代码。
GS的存在使得通过上述原理修改EIP时,肯定要填充cookie的内容。
在A函数结束时
1.add esp,原本的值-4 //清空cookie 上面的栈空间2.mov ecx,[ebp-0x4] //把当前cookie的值取出来放到ecx中3.call ____security_check_cookie()//调用函数检测值ecx的值是否和原本值相同4.mov esp,ebp //清除栈上的cookie内容2.pop ebp //ebp=ebp(上层)3.retn== pop eip jmp eip //jump has saved eip
____security_check_cookie()
安全cookie的检查通过__security_check_cookie函数。它的逻辑非常简单:
__security_check_cookie:
004011a5 3b0d30704000 cmp ecx,[__security_cookie (00407030)]004011ab 7501 jnz __security_check_cookie+0x9 (004011ae)
004011ad c3 ret
004011ae e9c1ffffff jmp report_failure
如果堆栈上的安全cookie的值和__security_cookie的值一致的话,那么函数正常退出。
否则,就会执行错误处理程序:跳往report_failure。之后,会运行__security_error_handler。
如果应用程序没有特别设定__security_error_handler,那么缺省的错误处理就会弹出以下提示框并终止程序。
怎么添加/取消GS编译选项
用vs2008举例,GS编译选项的勾选和取消
这篇关于GS编译选项是什么?为什么?怎么办?简单理解(security_cookie)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!