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

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

Java编译错误java.lang.NoSuchFieldError的解决方案详析

《Java编译错误java.lang.NoSuchFieldError的解决方案详析》java.lang.NoSuchFieldError是Java中的一种运行时错误,:本文主要介绍Java编译错... 目录前言解决方案1. 统一JDK版本环境2. 优化maven-compiler-plugin配置3. 清

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大