免費開始練習
moea_joint_essay 112年 [資訊] 資訊管理、程式設計

第 二 題

📖 題組:
下列程式經審閱後有嚴重的安全性威脅,可讓使用者執行不被允許的指令,請回答下列問題:(3 題,共 15 分) #include #include int main() { char username[16]; char password[16]; printf("Enter your username: "); gets(username); printf("Enter your password: "); gets(password); if (strcmp(username, "testuser") == 0 && strcmp(password, "testpwd ") == 0) { printf("Access granted!\n"); } else { printf("Access denied!\n"); } return 0; }
📝 此題為申論題,共 3 小題

小題 (二)

請說明此安全性威脅如何造成危害及其運作原理?(6 分)

思路引導 VIP

解釋 gets() 函數不會檢查輸入長度,當輸入超過宣告大小 (16 bytes) 時,資料會覆寫記憶體中相鄰的堆疊區域 (Stack),改變變數值甚至覆寫返回位址 (Return Address)。

🤖
AI 詳解
AI 專屬家教

運作原理與危害:

  1. 運作原理:程式中使用了 C 語言的 gets() 函數來讀取使用者輸入,但 gets() 不會檢查目的緩衝區(username 與 password 陣列長度僅 16 bytes)的大小,它會持續讀取輸入直到遇到換行符號或 EOF 為止。若惡意使用者輸入超過 15 個字元(加上字串結尾的 '\0'),多餘的字元將會溢出該緩衝區的邊界。
  2. 危害:溢出的資料會覆寫堆疊(Stack)中相鄰的記憶體空間。攻擊者可藉此覆寫相鄰的變數內容(如繞過密碼檢查)、覆蓋函數的返回位址(Return Address)或插入惡意的 Shellcode,進而改變程式的執行流程,導致未經授權的存取權限,或者允許攻擊者在系統上執行任意指令。

小題 (一)

請說明該程式具有何種安全性威脅?(3 分)

思路引導 VIP

指出程式碼中使用了不安全的 gets() 函數,這會導致緩衝區溢位漏洞。

🤖
AI 詳解
AI 專屬家教

該程式具有「緩衝區溢位(Buffer Overflow)」的安全性威脅。

小題 (三)

為改善上述程式,請提出修訂作法。(6 分)

思路引導 VIP

建議使用安全版本的字串讀取函數如 fgets() 取代 gets(),並限定讀取的最大長度以防止溢位。

🤖
AI 詳解
AI 專屬家教

修訂作法是廢除使用 gets() 函數,改用具備邊界檢查的 fgets() 函數,並配合處理可能帶入的換行字元。具體修訂如下:

// 將原本的 gets(username) 改為:

🏷️ 相關主題

物件導向程式設計與系統分析核心概念
查看更多「[資訊] 資訊管理、程式設計」的主題分類考古題