Welcome

首页 / 软件开发 / C++ / 运行时和编译时的安全性检查

运行时和编译时的安全性检查2011-04-12摘要:说明 Visual C++ 编译器和库在帮助开发人员提高其应用程序可靠性和安全性方面的功能。

样例应用程序中包含六个测试,用来模拟程序员可能会犯的某些错误,或者模拟对未采取任何保护措施的程序进行恶意输入所产生的某些后果:

1.通过多次运行循环程序覆盖缓冲区。由于只定义了一个缓冲区,因此覆盖缓冲区将影响包含返回地址的堆栈的剩余部分。

2.当另一个缓冲区也在堆栈中时覆盖缓冲区。

3.不覆盖缓冲区。

4.使用未初始化的变量。

5.执行可能导致丢失信息的转换。

6.以更复杂的方式使用未初始化的变量。

其中的某些测试与 /GS 和 /RTC 选项相关。

/GS -- 缓冲区安全性检查

如果使用 /GS 进行编译,将在程序中插入代码,以检测可能覆盖函数返回地址的缓冲区溢出。如果发生了缓冲区溢出,系统将向用户显示一个警告对话框,然后终止程序。这样,攻击者将无法控制应用程序。用户也可以编写自定义的错误处理例程,以代替默认对话框来处理错误。

在返回地址之前将插入一个专门的 cookie(系列字节),以使得任何缓冲区溢出都将更改该 cookie。在函数返回之前,将测试 cookie 的值。如果 cookie 值已被更改,将会调用处理程序。服务器或服务可能会要求进行不同的处理,而不是显示一个对话框,请参阅 MSDN,以获取有关编写自己的处理程序的详细信息。

此 cookie 由 C 运行库在程序启动时生成,攻击者将无法知晓 cookie 值,并且在每次运行程序时,该值都不相同。由于使用了 CRT,因此 C 运行库不会象发生误报时那样初始化两次以及重复生成 cookie。

此编译器选项适用于已发布的代码。用于编译样例代码的命令提示代码为:

cl /O2 /ML /GS /EHsc GS-RTC.cpp

(/O2 选项将打开优化功能。它不是调试版本。)运行此命令将创建 gs-rtc.exe。

测试 1 设计用于显示 /GS 选项的功能:

void Test1()
{
char buffer1[100];
for (int i=0 ; i < 200; i++)
{
buffer1[i] = "a";
}
buffer1[sizeof(buffer1)-1] = 0;
cout << buffer1 << endl;
}