天天看点

浅谈栈帧(二)

    接上一篇:浅谈栈帧(一)

   上一篇我们简单说了一下关于堆栈与栈帧调用函数是如何调用的,堆栈中的数据是如何存储在内存中的,用了几个简单的实例去观察分析他。

   这篇,我们从根本来思考一下堆栈这种东西:

    其实在计算机的早期,电脑的内存是用是十分老实的,没错就是老实。他没有进行一些内存空间上的保护。

    大家想想,在当内存空间不存在保护时,我们利用一个函数不断去改写计算机本身的内存,然后导致缓冲区溢出。这将使电脑崩溃,无法使用。因为内存不存在狡兔三窟,所以就老老实实的被病毒所平推了,就是是强拆,所以强拆是多么的令人感到可恶。

    其实在1988年蠕虫病毒就利用缓冲区溢出而占用系统资源导致计算机瘫痪。

    (1)那么内存是怎么进行保护的呢?

    在LINUX系统下,0xC00000000-0XFFFFFFFF为系统空间,为所有的系统进程所共享,0X00000000-0XBFFFFFFF为用户空间。

    其实在对抗缓冲区溢出攻击:

    Linux上GCC版本提供的机制,

    1.栈随机化:

     在内存中,我们都是通过指针跳转,寄存器都是针对于指针进行操作,当存在入侵者时。如果攻击者可以确定一个常见web服务器所使用的占空间,就缓冲区溢出。就可以控制了。(栈的安全单一化)

    所以为了解决这个问题,就使用了栈的随机化思想:

      其实就是利用内存空间虚拟地址中,其实都是通过寻址映射来进行。对于一个人来说,他干一个不安全的事情,最好的就是去将这件事情变得让人猜不透,所以。栈的随机化,指程序开始时,在栈上分配一段0~n字节之间的随机大小空间。

    在Linux系统中,栈随机化已经变成了标准行为。它是更大一类技术中的一种,这类技术称为地址空间布局随机化。或者简称为ASLR。每次运行时程序的不同部分,包括程序代码,库代码,栈,全局变量和堆数据,都会加载到存储器的不同区域。

    2.栈破坏检测:

    GCC在产生的代码中加入一个栈保护者机制用来检测缓冲区越界,叫做金丝雀值。也称哨兵值。

图解:(出自深入理解计算机系统)

浅谈栈帧(二)

    3.限制可执行的代码区域:

      就是消除攻击者向系统中插入可执行代码的能力,就是虚拟存储空间的分页制度了,当然还有读/写/执行权限.

继续阅读