讲清楚代码如何在系统栈工作的基本认知,一字一句的弄清楚 ,本篇内容:内存不同用途,栈与系统栈,寄存器与函数栈帧(上半部分) 要懂点C和汇编语言会好点, 恶补下《IBM X86 汇编》或者《Win32 汇编》,容易区分明白。
系统栈的工作原理
内存的不同用途
缓冲区溢出就是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。
成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。要透彻地理解这种攻击方式,我们需要回顾一些计算机体系架构方面的基础知识,搞清楚 CPU、寄存器、内存是怎样协同工作而让程序流畅执行的。根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下 4 个部分。
(1) 代码区: 这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
(2) 数据区: 用于存储全局变量等。
(3) 堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。
(4)栈区: 用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。
在 Windows 平台下,高级语言写出的程序经过编译链接,最终会变成PE文件(