目录

一,前言

二,堆栈溢出原理

三,操作系统内置的安全机制

四,参考

一,前言

缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞,在各种操作系统、应用软件中广泛存在。缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击,轻则可以导致程序失败、系统关机等,重则可以利用它执行非授权指令,甚至获取系统特权,从而进行其它的非法操作。缓冲区攻击有栈溢出、堆溢出、格式化字符串漏洞、整形变量溢出等。以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞。由此引发的安全问题比比皆是。为了尽可能避免缓冲区溢出漏洞被攻击者利用,现今的编译器设计者已经开始在编译器层面上对堆栈进行保护。

二,堆栈溢出原理

在计算机里,堆栈是内存里的一段区域。堆一般由程序员分配释放,如果程序员不释放,程序结束时可能由操作系统回收,分配方式类似于数据结构中的链表;栈由操作系统自动分配释放,存放函数的参数值、局部变量、返回地址等,分配方式类似于数据结构中的栈。以堆栈溢出为代表的缓冲区溢出已经成为最普遍的安全漏洞,由此引发的安全问题比比皆是。堆栈溢出的原因一般有以下几种:

1,函数调用层次太深。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,,如果递归调用太深,就会造成栈溢出,这是递归无法返回。再者,当有函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。

2,动态申请空间(可参考下文了解更多)C/C++动态内存开辟详解(含常见错误以及经典面试题)_利刃Cc的博客-CSDN博客_c++动态开辟空间使用之后没有释放。由于c语言中没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间。申请的动态空间使用的是堆空间,动态空间使用不会造成堆溢出。

3,数组访问越界。C语言没有提供数组下标越界检查,如果在程序中出现数组下标访问超出数组范围,在运行过程中可能会内存访问错误。

4.指针非法访问。指针保存了一个非法的地址,通过这样的指针访问所指向的地址时会产生内存访问错误。

堆溢出:不断的new一个对象,一直创建新的对象

栈溢出:死循环或者是递归太深的原因,可能太大或者没有终止。

通常堆栈溢出是指调用堆栈溢出,溢出是指这个数据结构的满溢,不能存放更多数据,其他的数据结构也会遇到这种情况。即使数据结构并非固定容量,而是可扩展的,在有限的内存空间下仍是有满溢的机会。

在一些高级语言中,类似python, java, go等,有一些机制用于防止栈溢出,比如,python默认的递归深度是1000,当递归调用超过这个深度后就会引发异常。此外,编译器层面上也有对堆栈进行保护,其中最著名的是Stack Guard和Stack-smashing Protectection。在操作系统的层面上,为了减少堆栈溢出带来的危害,还有类似于地址空间随机化的机制。

三,操作系统内置的安全机制

Windows:

1,DEP(data execution prevention):使得系统能够标记一个或多个内存页的属性为不可执行(意味着代码不能在该内存页中执行),有助于缓解缓冲区溢出攻击的危害。

2,ASLR(address space layout randomization):加载地址随机化机制

开启方式:vs开发环境中的链接器下的高级选项中可以设置映像随机化,堆栈随机化,PEB和TEB随机化

3,GS机制:缓冲区安全检查,编译器会为每个函数调用的入口增加额外的随机数(被称为canary),它位于EBP之前,同时在data内存区存放该随机数的副本,当函数发生溢出时,它会被覆盖,函数在返回之前会比较data区中的副本的值和栈帧的真实值,如果两者不同,则触发异常处理流程。

开启方式:vs开发环境中的c/c++下的代码生成中的开启缓冲区安全检查

Linux:

1,NX机制(no-execute):同Windows上的DEP功能相似

关闭NX机制(于是JMP与ESP无法使用);编译时增加 -z execstack; 开启NX机制:编译时增加 -z noexecstack(默认开启)

2,PIE机制(position-independent-executables):位置独立的可执行区域,同Windows系统的ASLR功能相似,一般同NX机制配合使用,能够有效组织在堆栈上运行恶意代码,PIE有三种工作模式:1,工作模式0:关闭进程地址空间随机化

2,工作模式1:开启mmap机制,stack和vdso的地址随机化

3,工作模式2:在1的基础上,增加堆地址随机化

3,Cannary栈保护:同Windows上的GS机制,一种预防缓冲区溢出的手段,

开启cannary栈保护,在编译时增加 -fstack-protector(只为含char数组的函数加入保护代码)和-fstack-protector-all(为所有函数加入保护代码)

关闭cannary保护,在编译时增加 -fno-stack-protector(默认不开启)

4,RelRo机制:设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。

全部开启RelRo机制:在编译时增加 -z now

部分开启RelRo机制:在编译时增加 -z lazy(默认配置)

关闭RelRo机制: 在编译时增加 -z norelro

四,参考

堆栈溢出一般是什么原因 - 知乎 (zhihu.com)

程序编译保护堆栈溢出保护机制相关推荐

  1. FreeRTOS中的任务堆栈溢出检测机制

    关注+星标公众号,不错过精彩内容 转自 | 麦克泰技术 在FreeRTOS中,每个任务都拥有自己的堆栈,该堆栈的大小由创建任务时xTaskCreate函数的函数参数所决定. 但当任务所使用的堆栈空间超 ...

  2. c++堆栈溢出怎么解决_栈溢出基础

    一. 基础知识 什么是缓冲区溢出 在深入探讨技术之前, 让我们先了解一下缓冲区溢出的实际内容.想象一个非常简单的程序, 要求你输入你的用户名, 然后返回到它在做什么.从视觉上看, 如下所示 注意到括号 ...

  3. 嵌入式编程中的堆栈溢出检测

    在嵌入式编程中,栈是一个很重要的概念,不管是裸机编程还是基于RTOS编程.函数形参.局部变量.函数调用现场的保护及返回地址.中断函数执行前线程保护及中断嵌套的现场的保护都依赖于栈空间.栈空间不足,程序 ...

  4. 10-FreeRTOS堆栈溢出

    1-堆栈溢使用情况和溢出检查 1.1堆栈的使用情况 如果使用xTaskCreate()创建任务,那么作为任务堆栈的内存将自动从FreeRTOS堆中分配,并通过传递给xTaskCreate() API函 ...

  5. java反编译工具_如何保护Java程序 才能防止Java反编译

    简介:Java是一种跨平台的.解释型语言.Java 源代码编译中间"字节码"存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如 ...

  6. windows溢出保护原理与绕过方法概览(转自riusksk's blog(泉哥))

    前言 从20世纪80年代开始,在国外就有人开始讨论关于溢出的攻击方式.但是在当时并没有引起人们的注意,直至后来经一些研究人员的披露后,特别是著名黑客杂 志Phrack上面关于溢出的经典文章,引领许多人 ...

  7. 溢出科普:heap overflow溢出保护和绕过

    pr0mise · 2016/04/11 9:50 0x00 第一部分:heap overflow 接上文,来看另外一种溢出方式:堆溢出.相对于栈溢出来说,稍微麻烦一点 本文算是一个笔记,技术有限,难 ...

  8. 系统在此应用程序堆栈溢出_从部署我的第一个完整堆栈Web应用程序中学到的经验教训...

    系统在此应用程序堆栈溢出 by Will Abramson 威尔·艾布拉姆森(Will Abramson) 从部署我的第一个完整堆栈Web应用程序中学到的经验教训 (Lessons learned f ...

  9. 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈

    系统在此应用程序堆栈溢出 You have a great online business idea along with investors and a team ready to get behi ...

最新文章

  1. Linux之切换目录命令
  2. 组合使用Laravel和vfsStream测试文件上传
  3. linux进入text目录,Linux文件和目录操作命令 | Soo Smart!
  4. CreateThread
  5. 【Java】深入理解Java线程
  6. 【LeetCode笔记】238. 除自身以外数组的乘积(Java、思路题)
  7. 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片
  8. python图层合并_Ps算法Python实现:图层混合模式-色相
  9. 消息中间件学习总结(9)——RocketMQ与kafka差异比较分析
  10. Leetcode PHP题解--D7 905. Sort Array By Parity
  11. JavaScript 你必须了解的主流趋势!
  12. 几行VB代码拿下注册表
  13. bat脚本中,常用的开头与结尾(关闭回显,让输出变得更加简洁)
  14. 国际会议poster: 海报制作流程 格式介绍
  15. 华为5102路由器虚拟服务器,华为路由WS5102怎么设置wifi中继功能
  16. python表示倍数_python代表倍数
  17. 腾讯元老、上市公司CTO逃离北上广,赚够钱后他在安徽建了一片200亩的农场
  18. Matlab - Solidworks 机器人建模(6)——使用rigidBodyTree构建机器人模型
  19. 甲骨文CEO独家揭秘企业转型秘诀,就一个字
  20. 稳定性和高可用如何保障?一手测评华为云网站高可用解决方案

热门文章

  1. 第三章 rt-thread设备驱动模型-i2c驱动
  2. 微信公众号如何安全“涨粉”
  3. 团队软件库_液压阀块设计软件MDTools在重型重工中的应用
  4. listview 争夺焦点_浏览器趋势2015年6月:争夺第二名
  5. 双月湾海边+农家乐模式市场调研报告
  6. 长整型加法和乘法c语言,c语言大数加法,乘法,阶乘!
  7. BUUCTF笔记之Web系列部分WriteUp(五)
  8. 在mm32f3270为micropython移植utime模块
  9. 为什么DDoS攻击难以预防
  10. 【COMP207 LEC16 17 18】