oday安全:软件漏洞分析技术第十章栈中守护天使

为了防止缓冲区溢出时覆盖函数返回地址,编译器使用了很酷的编译选项——GS,GS工作原理如下:

1、在进程调用start( )函数时先初始化.data节区一个叫___security_cookie的变量(一个进程只用这一个___security_cookie值,不会有第二个)

2、在函数调用期间使用___security_cookie和ebp或者esp做亦或操作,并把结果保存在这个函数栈相对靠下的位置

3、这个函数调用结束后,拿步骤2中的变量再和ebp或者esp做亦或操作,结果和___security_cookie作比较,相同则此次函数调用栈未发生溢出,否则发生溢出,结束程序

那么GS使用的___security_cookie是如何被初始化、发生溢出时又是如何结束进程的?

1、start( )函数第一条指令call ___security_init_cookie,如图:

___security_init_cookie函数主要代码:

调用了GetSystemTimeAsFileTime( )、GetTickCount( )、QueryPerformanceCounter( ),GetCurrentProcessId( )、GetCurrentThreadId( )函数,把返回的dword值做多次亦或操作。

2、在函数调用结束判断栈是否溢出时调用@__security_check_cookie@4函数,如图:

@__security_check_cookie@4函数代码:

若发生栈溢出就转向函数___report_gsfailure( ),___report_gsfailure( )函数最后几行代码:

以上测试环境Windows XP(sp3)  VS2010

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章