遭遇sprintf導致的堆棧崩潰。不使用sprintf_s()的代價

來源:互聯網
上載者:User

 問題描述:

一直以來,引擎都啟動並執行很穩定。而且在所有電腦上都很穩定。

但是,唯獨一個筆記本不行。引擎在其上一運行就崩掉。

 

問題分析:
根據產生的dump檔案,windbg的分析結果為:
The stored exception information can be accessed via .ecxr.
(c98.da0): Stack buffer overflow - code c0000409 (first/second chance not available)

還有 frame IP 被破壞, (IP是什麼來著? 指令地址?忘了,權當作當前frame的基地址吧)可見, 可能是堆棧的基地址被破壞了

查看呼叫堆疊:
。。。一些系統的dll內建函式
xeyez!funxEyeLoadAllDll( ),

。。。。

 

問題應該出在funxEyeLoadAllDll這裡,
根據windbg提示的出錯行,定位到該函數的最後一行!! 可見就是函數返回時,返回失敗!

查看該函數的實現:

int funxEyeLoadAllDll( )
{
 char * strOldEnv;
 strOldEnv = getenv("Path");
 // 把外掛程式目錄加入到環境變數,以便可以讓系統載入DLL時找到外掛程式間依賴的DLL
 char newEnv[1024] = {0};
 sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);

 TCHAR buf[MAX_PATH] = {0};
 TCHAR *psz;
 GetModuleFileName(NULL, buf, MAX_PATH);
 

 。。。。。。

 。。。。。。
}  // windbg提示該行出錯           <-------------

經分析,可能問題出在 下面代碼處,下面代碼的意思是,把當前系統的PATH環境變數讀入到newEnv中。
由於使用sprintf非安全版,就可能破壞堆棧!
char newEnv[1024] = {0};
 sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);

果然, 查看那個筆記本的path變數,居然有10幾行,每行有100多個字母!

看來,防禦性編程是很有必要的!
不要假設客戶的電腦的情況!
還好,現在可以使用windbg+pdb檔案調試,要是不能,這樣的bug不知會調到什麼時候!更要命的是,可能會被駭客攻擊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.