你還敢用VC6嗎??

來個黑底白字時代C語言差不多應用最多的小段代碼吧

#include <stdio.h>

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溢出漏洞有感而發

引用自:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章