來個黑底白字時代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溢出漏洞有感而發
引用自:點擊打開鏈接