你还敢用VC6吗??

来个黑底白字时代C语言差不多应用最多的小段代码吧

#include

void main()
{
 char str[16];
 printf(“Input your name”);
 gets(str);
 puts(str);
}

很平常吧,没有问题吧?

很好,现在你去输入个大于24字节的字符串,按回车~

BiaJi,程序跑飞了,VC6的调试器直接切换到反汇编栏然后飞到了无人区,你是不是还一头雾水不知道哪里出问题了??

 

现在换用VC9测试。首先,上面的代码编译时会出现一个警告:

warning C4996: ‘gets’: This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

明明白白的告诉你,gets是不安全的,可能会出现问题,叫你换用gets_s。。。

信微软,得永生,我们换上gets_s运行测试,输入大于16字节的串,回车后立即触发了Assert:

提示信息:Buffer is too small。

就算是release模式同样被调试器拦下:

Microsoft Visual Studio C 运行时库在 test.exe 中检测到一个错误。

在debug模式下,Assert中断附加信息向你清楚地说明了问题之所在。你就直接去改吧,release下没出信息,但也通知调试器中断在gets_s函数里,不至于你满大街去找bug

 

现在我们不信微软,改回原来的gets,运行。

在main函数结束后调试器中断了,报告:Run-Time Check Failure #2 – Stack around the variable ‘str’ was corrupted.,这个中断是@_RTC_CheckStackVars@8函数产生的;

如果继续运行,则会连续两次报告:在已损坏了程序内部状态的 test.exe 中发生了缓冲区溢出,这两个报告是另外一个@__security_check_cookie@4函数产生的。随后这个安全检查函数调用TerminateProcess结束了进程。

 

而在VC6中,你就继续面对满屏无人区的???符号发呆吧,并且,在你努力给用户们做升级补丁的时候,黑客们已经开始利用你程序的这个漏洞侵入了你用户们的电脑,甚至可能取得了操作系统ring0权限,什么概念,人品坏一点的估计可以弄个新版CIH把你客户的主板烧了。

 

而无论是你自己调试找不到北,还是你的客户被当了肉鸡,这一切都是因为你选择了1998年的VC6!

赶紧更新换代吧,跟不上时代步伐也就罢了,当了用户的罪人就不好了~~

 

其实呢,大家也别太紧张了,这bug本来就不是你的错,当年猥琐软件公司貌似也写了像你这样的程序,后果也没啥太严重的,也就是诞生了一个叫冲击波的小程序。。

 

09年8月24日某小鬼研究QQ2009SP1及SP2 Unicode溢出漏洞有感而发

引用自:点击打开链接

你可能感兴趣的:(MFC)