浅谈栈帧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈栈帧相关的知识,希望对你有一定的参考价值。
接上一篇:浅谈栈帧(一)
上一篇我们简单说了一下关于堆栈与栈帧调用函数是如何调用的,堆栈中的数据是如何存储在内存中的,用了几个简单的实例去观察分析他。
这篇,我们从根本来思考一下堆栈这种东西:
其实在计算机的早期,电脑的内存是用是十分老实的,没错就是老实。他没有进行一些内存空间上的保护。
大家想想,在当内存空间不存在保护时,我们利用一个函数不断去改写计算机本身的内存,然后导致缓冲区溢出。这将使电脑崩溃,无法使用。因为内存不存在狡兔三窟,所以就老老实实的被病毒所平推了,就是是强拆,所以强拆是多么的令人感到可恶。
其实在1988年蠕虫病毒就利用缓冲区溢出而占用系统资源导致计算机瘫痪。
(1)那么内存是怎么进行保护的呢?
在LINUX系统下,0xC00000000-0XFFFFFFFF为系统空间,为所有的系统进程所共享,0X00000000-0XBFFFFFFF为用户空间。
其实在对抗缓冲区溢出攻击:
Linux上GCC版本提供的机制,
1.栈随机化:
在内存中,我们都是通过指针跳转,寄存器都是针对于指针进行操作,当存在入侵者时。如果攻击者可以确定一个常见web服务器所使用的占空间,就缓冲区溢出。就可以控制了。(栈的安全单一化)
所以为了解决这个问题,就使用了栈的随机化思想:
其实就是利用内存空间虚拟地址中,其实都是通过寻址映射来进行。对于一个人来说,他干一个不安全的事情,最好的就是去将这件事情变得让人猜不透,所以。栈的随机化,指程序开始时,在栈上分配一段0~n字节之间的随机大小空间。
在Linux系统中,栈随机化已经变成了标准行为。它是更大一类技术中的一种,这类技术称为地址空间布局随机化。或者简称为ASLR。每次运行时程序的不同部分,包括程序代码,库代码,栈,全局变量和堆数据,都会加载到存储器的不同区域。
2.栈破坏检测:
GCC在产生的代码中加入一个栈保护者机制用来检测缓冲区越界,叫做金丝雀值。也称哨兵值。
图解:(出自深入理解计算机系统)
3.限制可执行的代码区域:
就是消除攻击者向系统中插入可执行代码的能力,就是虚拟存储空间的分页制度了,当然还有读/写/执行权限.
其实总结来说。计算机中对于保护的机制就是——随机化,栈保护和限制哪部分存储器可以存储可执行代码。
以后会进行补充。
本文出自 “剩蛋君” 博客,请务必保留此出处http://memory73.blog.51cto.com/10530560/1759204
以上是关于浅谈栈帧的主要内容,如果未能解决你的问题,请参考以下文章