免費開始練習
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 小題

小題 (一)

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

思路引導 VIP

說明這段 C 程式碼使用了 gets() 函數,這是一個不安全的函數,容易導致緩衝區溢位 (Buffer Overflow)。

🤖
AI 詳解
AI 專屬家教

該程式具有緩衝區溢位 (Buffer Overflow) 的安全性威脅。主要因為使用了 C 語言標準函式庫中不安全的 gets() 函式來讀取使用者輸入。

小題 (二)

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

思路引導 VIP

解釋緩衝區溢位如何運作以及危害。gets() 不會檢查輸入長度。如果輸入的字串超過預先配置的字元陣列長度 (16 byte),多出來的資料將會覆蓋記憶體中相鄰的資料。駭客可以藉此覆蓋堆疊(stack)中的變數或返回位址(return address),執行任意惡意程式碼或改變程式執行流程。

🤖
AI 詳解
AI 專屬家教

gets() 函式在讀取輸入字串時,不會檢查目的緩衝區的長度上限,它會一直讀取到遇到換行符號或 EOF 為止。在此程式中,usernamepassword 陣列各自僅配置了 16 個字元 (bytes) 的空間。若攻擊者輸入超過 15 個字元 (加上結尾字元 \0),多出的資料會寫入到這兩個陣列之外的記憶體區域。 這會覆蓋堆疊 (Stack) 中相鄰的變數內容,甚至覆蓋函式的返回位址 (Return Address)。攻擊者可藉由精心構造的輸入字串,將返回位址指向惡意程式碼的位置,進而取得系統控制權或執行不被允許的指令。

小題 (三)

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

思路引導 VIP

提出如何防範緩衝區溢位,主要是使用安全的輸入函式,例如 fgets() 替換 gets()

🤖
AI 詳解
AI 專屬家教

應避免使用 gets() 函式,改用會限制最大讀取長度的安全函式,例如 fgets()。修訂作法如下: 將 gets(username); 改為 fgets(username, sizeof(username), stdin);gets(password); 改為 fgets(password, sizeof(password), stdin);

🏷️ 相關主題

程式設計演算法與資料結構實作
查看更多「[統計資訊] 資料庫及資料探勘、程式設計」的主題分類考古題