文章标题:栈溢出到底是什么?


【*】发布时间:2019 年 05 月 14 日

作者信息

本文作者:joe 审核:天析

0x1:栈溢出学习基本要求

1.对汇编基础有一定的了解,以及相关的编程语言基础 2.有一颗好学的心

0x2:对于程序运行的了解

寄存器和内存什么关系?必须通过寄存器才能和内存通讯吗?

首先,我们要知道的是,寄存器是CPU里面的东西,而内存是在CPU外面的数据总线上,在计算机中的所有程序运行都是在内存中进行的!

堆栈是内存中的一个数据结构,内存是CPU和硬盘之间的通道,寄存器是CPU的存储器。

虚拟地址

即虚拟内存地址,程序使用的内存地址是虚拟地址,即程序运行在虚拟地址空间中。

并不是所有的 “ 程序 ” 都是运行在虚拟地址中,CPU在启动时是运行在实模式,Bootloader 以及 内核 在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。

物理地址

物理地址指实际存在的物理内存地址,访问该内存中的一个地址,那就需要对应的物理内存。

映射

通过页表,进行一对一的映射

0x3:什么是栈溢出?

所谓溢出,就是超出了一个规定的范围,广义上就是超出范围,导致某些不好的事情发生。

什么是栈?

栈又叫堆栈,你可以把它理解为一个盒子,进栈、出栈遵循先进后出的规则

img

为什么会溢出?

例(C语言): 在C语言中没有内置的检查机制来确保复制到缓冲区的数据不得去大于缓冲区的大小,于是当我们这个数据足够大的时候,将会溢出缓冲区的范围之外,导致写到了不该写的地方。 也正是这样,让我们可以通过此方式去夺取一些敏感的权限。

int f(int x){int a[10];

什么项目容易出现?

越大的项目,溢出将会变得越来越难以避免!

0x4:相关漏洞(部分)

···

CVE-2018-17916

CVE-2018-14829

CVE-2017-11882

CVE-2017-9430

CVE-2015-8651

CVE-2014-3100

CVE-2012-0158

CVE-2011-0104

CVE-2010-3333

CVE-2010-0188

CVE-2009-0927

CVE-2008-2992

CVE-2007-5659

···

0x5:总结

由年份可以看出栈溢出的寻找无疑将会是困难的,但是一旦收获一个 “ 溢出 ” 漏洞,将会是你针对系统或者说客户端的最大的利器!