緩沖區溢出問題-軟考信息安全工程師案例分析


來自某年軟考信息安全工程師下午案例分析題

某網站上給出的答案如下:

當獲取到鍵盤輸入的password超過8個字符時,后續的數據會覆蓋掉authenticated,但為啥空字符就可以跳過呢?
我實際在VS2012環境下新建了個控制台項目,代碼如下:

代碼編譯提示出錯,需要在項目-屬性-配置選項-C/C++-預處理器中添加_CRT_SECURE_NO_WARNINGS選項

以下是單步調試過程中的一些截圖

以下是一些分析和結論:
1.某網站給的答案是password[8-11]是空字符的話,經實際驗證無法覆蓋authenticated。因為空字符輸入后被隔斷了,例如“bbbbbbbb[ 此處4個空格]aaaa”輸入后password實際數據為“bbbbbbbb\0",無法覆蓋。
2.password中間password[8-11]4個字符為0,strcpy的時候覆蓋了authenticated變量;單步調試時發現strcmp是authenticaed=1, 一旦strcpy之后authenticated就是0了,所以后續返回valid_flag就是0,correct password。
3.如果獲取password時輸入的數據過大,比如超過12個字符以上,將除了覆蓋authenticated變量,還會覆蓋main EBP及返回,所以程序會導致不可預知的結果。
4.我自己還有個疑問:為啥strcpy拷貝過去就是0呢,不是字符“0000”對應的ascii 0x30303030呢?我不知道在vs2012里面怎么樣看堆棧數據,求大神解答下!

同樣的也是緩沖區溢出,這道題就比較淺顯多了:gets(userpassword)的時候,只要確保輸入前12個和后12完全一致就出現緩沖區溢出錯誤了,因為userPassword拷貝時覆蓋了高位地址的origPassword


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM