编译器防止栈溢出的策略

栈溢出的原理前面已经说过,为了防止栈溢出增加了一个全局变量 ___security_cookie ,把它和当前esp做异或后,值放到保存的eip、ebp得上面(该函数栈空间的第一个变量)

该函数调用结束后,再把var_4和esp(两处的esp值应该是相同的)做异或,值放到ecx里面,调用函数@__security_check_cookie@4( )(注意:该函数直接使用ecx值)

@__security_check_cookie@4函数汇编代码:

这个函数会检查ecx是否等于全局变量___security_cookie,相等直接返回,不做任何事情;不相等就说明在函数调用过程中修改了var_4的值,出现了栈溢出,转到___report_gsfailure处,___report_gsfailure处的汇编代码最终调用了TerminateProcess( ),退出码为STATUS_STACK_BUFFER_OVERRUN,汇编代码如下:

这种方法只是一定程度上发现栈溢出立刻终止程序,但是对于一些巧妙的人为设计,还是不能很好的预防。

这种防止栈溢出的策略,添加到函数中的原则是什么?

编译器就是原则,它认为要加就加,没有必要加就不加。

以上内容在《软件调试》第22章12节有详细介绍。

猜你喜欢

转载自blog.csdn.net/singleyellow/article/details/84106741