C语言中什么是出栈?
2个回答
展开全部
栈是一种数据结构,一个栈相当于一个盒子,把东西(数据)放入盒子里的过程叫做入栈,把东西从盒子里取出来的过程叫做出栈。栈还有一个特殊的规则,就是先进后出,即盒子里的东西只能叠加摆放,放进去的下一件东西只能堆在前一件东西的上面,取出时只能先取出盒子最上面的一件东西。出栈也就是将栈指针所指的数据从栈中弹出的过程,每一次出栈的一定是栈顶元素,出栈后栈指针向下移动一位指向下一个元素。习惯上入栈用PUSH表示,出栈用POP表示。
追问
有人说用出栈做的病毒是什么意思?
追答
就是指栈溢出攻击。因为C语言有一个特性,不检查堆栈越界,因此可能导致输入数据超出堆栈缓冲区长度而发生溢出。在调用子程序进入堆栈时,编译器会首先压入主程序返回地址和基址寄存器地址,然后将基址寄存器作为堆栈栈底指针,为数据开辟缓冲区。这时如果故意输入长度大于缓存区的数据,就会造成溢出,溢出的数据会向上覆写栈底EBP的值以及返回地址的值,而造成返回地址错误,等到子程序返回时就会找不到返回地址,而导致程序崩溃。而如果利用精心设计的数据去溢出堆栈,使返回地址的值被覆写为病毒的入口地址,程序返回时就会去执行攻击者设计的任意病毒程序,而造成不可想象的结果。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询