栈溢出
栈溢出原理
溢出(overflow)可以说是网络漏洞的万恶之源,栈溢出(stack overflow)是其中比较常见和好理解的一种,彻底搞明白原理需要先搞懂计算机组成和结构(先让我逼逼一会)

如果你身边有台式机的话可以动手拆机了解一下理解更深刻,可以看到你台式机有键盘,音响,鼠标,显示器(就是那个黑色屏幕),主机(就是那个嗡嗡响的长方体箱子,是接下来的重点研究对象
栈(stack)是一种基本数据结构,核心逻辑是[先进后出](LIFO),在计算机系统中栈位于内存(memory),为了更形象地理解可以把栈想象为一个倒放的容器,栈底位于高地址,栈顶位于低地址。
现在知道栈长什么样子了,那怎么先进后出呢?这里有两个操作,以amd架构为例,一个叫[弹入](push),还有一个[弹出](pop),这里不用理论解释,例子就能理解。
举一个日常生活中最普通例子,你打开浏览器,先访问谷歌,谷歌弹入栈底,再访问bing,bing弹入栈,但它不会直接穿透谷歌,而是叠在谷歌下方,再访问百度,百度叠在bing下方,再跳转到某第三方界面。这时候google.com位于栈底,m.baidu.com位于栈顶,bing.com被夹在中间。下一步我们点击一次回滚,界面变成百度,说明百度已经被取出,栈顶变成bing,继续回滚,bing被取出,界面变成bing,栈顶变成谷歌,继续回滚,谷歌被取出,界面变成谷歌,栈空,返回起始页。
这个例子理解了就简单了,我们接下来带入计算机的底层结构,开头说了栈位于内存,例子中的[取出]是放到哪里了呢,这个物件叫寄存器(register),寄存器位于CPU(中文叫处理器),CPU的目的不是存储数据,只负责运算和执行