什么是栈溢出?
介绍
了解栈溢出,首先要了解什么是栈。
栈是一种典型的先进后出( First in Last Out )的数据结构,其操作主要有压栈(push)与出栈(pop)两种操作。
进栈(PUSH): 将一个数据放入栈里叫进栈(PUSH),相当于在扑克牌的在最上面放了一张新的扑克牌。
出栈(POP): 将一个数据从栈里取出叫出栈(POP),相当于在扑克牌的在最上面拿走了一张扑克牌。
栈在生活中的例子:堆放的餐盘,只能按顺序取放,进栈就是将盘子放在最上面,出栈就是将最上面的盘子拿走。
栈溢出
栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是
- 程序必须向栈上写入数据。
- 写入的数据大小没有被良好地控制。