运行时错误检查(/RTC)编译选项及实现原理
作者:童磊(magictong)
环境:VS2005
前因后果:debug居然编不过!!!这里准备说4个例子,都是为了说明debug版本对于调试是很重要的,很多问题在调试版本下都会提前暴露出来。
注意:随意调整优化,可调试选项可能会遇到下面的编译错误:
Command line error D8016 : '/O2' and '/RTC1' command-line options are incompatible
(http://msdn.microsoft.com/zh-cn/library/8wtf2dfz(v=vs.80).aspx)
1、/GS
名称:缓冲区安全检查(http://msdn.microsoft.com/zh-cn/library/8dbf701c(v=vs.80).aspx)。
编译选项位置:C/C++ à Code Generation à Buffer Security Check
说明:缓冲区溢出安全检测,要强调的是,该编译选项并不是对每一个函数都设置安全cookies。编译器首先会判断一个函数是否是属于“潜在危险”的函数,例如是否在函数的堆栈上分配了字符串数组等等,就可以作为一个特征(编译器怎么判断的偶没研究过o(∩_∩)o )。只有被编译器判断是存在“潜在危险”的函数之后,编译器才会在这个函数里面使用安全cookie检测。但是要注意,它不能预防所有的安全漏洞。
原理:
#include "stdafx.h"
#include <string.h>
void Function(const char*);
int _tmain(int argc, _TCHAR* argv[])
{
char pBuf[] = "aaaaaaaaaaaa";
Function(pBuf);
return 0;
}
void Function(const char* pBuf)
{
char szBuf[10];
strcpy(szBuf, pBuf);
}
void Function(const char* pBuf)
{
004017E0 push ebp
004017E1 mov ebp,esp
004017E3 sub esp,10h
004017E6 mov eax,dword ptr [___security_cookie (403000h)]
004017EB xor eax,ebp
004017ED mov dword ptr [ebp-4],eax
char szBuf[10];
strcpy(szBuf, pBuf);
004017F0 mov eax,dword ptr [ebp+8]
004017F3 push eax
004017F4 lea ecx,[ebp-10h]
004017F7 push ecx
004017F8 call strcpy (401010h)