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

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。