GS编译选项是什么?为什么?怎么办?简单理解(security_cookie)

2024-02-24 10:18

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741786

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统