扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
摘要:说明 Visual C++ 编译器和库在帮助开发人员提高其应用程序可靠性和安全性方面的功能。
本文是 Visual C++ Toolkit 2003 中所包含的代码样例的一部分,可从 http://msdn.microsoft.com/visualc/vctoolkit2003(英文)下载。
样例应用程序中包含六个测试,用来模拟程序员可能会犯的某些错误,或者模拟对未采取任何保护措施的程序进行恶意输入所产生的某些后果:
通过多次运行循环程序覆盖缓冲区。由于只定义了一个缓冲区,因此覆盖缓冲区将影响包含返回地址的堆栈的剩余部分。
当另一个缓冲区也在堆栈中时覆盖缓冲区。
不覆盖缓冲区。
使用未初始化的变量。
执行可能导致丢失信息的转换。
以更复杂的方式使用未初始化的变量。
其中的某些测试与 /GS 和 /RTC 选项相关。
如果使用 /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; }
其中的 for 循环将执行很多次,从而使返回地址以及其他地址溢出。要运行测试 1,请使用 /GS 选项编译程序,然后执行以下命令:
gs-rtc 1
此时将显示以下对话框:
作为对比,下面为不使用 /GS 选项编译相同的代码:
cl /Od /MLd /EHsc /ZI GS-RTC.cpp /link
再次运行测试,此时系统将显示以下对话框:
使用缓冲区溢出攻击方式的攻击者将使用精心设计、可为攻击者提供控制能力的地址来覆盖返回地址:此样例仅在返回地址上写入了多个 a(十六进制的 61)。
/GS 将无法检测到不覆盖返回地址、但会破坏其他内存并导致结果错误的溢出。请尝试使用到目前为止所显示的任意一条编译命令来运行测试 2。
gs-rtc 2
虽然测试 2 覆盖内存,但 /GS 选项却无法检测出来。在此代码的优化版本中,删除了循环语句后面的空终止符分配,因此未出现覆盖所引起的后果。通常这种情况不会发生。
查看本文来源如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者