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,如图:

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

___security_init_cookie函数主要代码:

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

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

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

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

@__security_check_cookie@4函数代码:

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

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

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

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

你可能感兴趣的:(oday安全:软件漏洞分析技术)