開啟主選單

求真百科

溢出

來自 圖蟲創意網 的圖片

溢出黑客利用操作系統的漏洞,專門開發了一種程序,加相應的參數運行後,就可以得到你電腦具有管理員資格的控制權,你在你自己電腦上能夠運行的東西他可以全部做到,等於你的電腦就是他的了。溢出是程序設計者設計時的不足所帶來的錯誤

目錄

基本信息

中文名 溢出 [1]

外文名 runout extravasation

拼音 yì chū [2]

buffers 長跳轉緩衝區

激活紀錄 Activation Records

分類 緩衝區溢出

溢出的原因

現實狀況

在幾乎所有計算機語言中,不管是新的語言還是舊的語言,使緩衝區溢出的任何嘗試通常都會被該語言本身自動檢測並阻止(比如通過引發一個異常或根據需要給緩衝區添加更多空間)。但是有兩種語言不是這樣:C 和 C++ 語言。C 和 C++ 語言通常只是讓額外的數據亂寫到其餘內存的任何位置,而這種情況可能被利用從而導致恐怖的結果。更糟糕的是,用 C 和 C++ 編寫正確的代碼來始終如一地處理緩衝區溢出則更為困難;很容易就會意外地導致緩衝區溢出。除了 C 和 C++ 使用得 非常廣泛外,上述這些可能都是不相關的事實;例如,Red Hat Linux 7.1 中 86% 的代碼行都是用 C 或 C ++ 編寫的。因此,大量的代碼對這個問題都是脆弱的,因為實現語言無法保護代碼避免這個問題。

客觀原因

在 C 和 C++ 語言本身中,這個問題是不容易解決的。該問題基於 C 語言的根本設計決定(特別是 C 語言中指針和數組的處理方式)。由於 C++ 是最兼容的 C 語言超集,它也具有相同的問題。存在一些能防止這個問題的 C/C++ 兼容版本,但是它們存在極其嚴重的性能問題。而且一旦改變 C 語言來防止這個問題,它就不再是 C 語言了。許多語言(比如 Java 和 C#)在語法上類似 C,但它們實際上是不同的語言,將現有 C 或 C++ 程序改為使用那些語言是一項艱巨的任務。

普遍因素

然而,其他語言的用戶也不應該沾沾自喜。有些語言存在允許緩衝區溢出發生的"轉義"子句。Ada 一般會檢測和防止緩衝區溢出(即針對這樣的嘗試引發一個異常),但是不同的程序可能會禁用這個特性。C# 一般會檢測和防止緩衝區溢出,但是它允許程序員將某些例程定義為"不安全的",而這樣的代碼 可能 會導致緩衝區溢出。因此如果您使用那些轉義機制,就需要使用 C/C++ 程序所必須使用的相同種類的保護機制。許多語言都是用 C 語言來實現的(至少部分是用 C 語言來實現的 ),並且用任何語言編寫的所有程序本質上都依賴用 C 或 C++ 編寫的庫。因此,所有程序都會繼承那些問題,所以了解這些問題是很重要的。

溢出解決方法

受控代碼

2002 年 2 月和 3 月,微軟公司展開了 Microsoft Windows Security Push 活動。在此期間,我所在的小組一共培訓了超過 8500 人,教授他們如何在設計、測試和文檔編制過程中解決安全問題。在我們向所有程序設計人員提出的建議中,有一條就是:緊跟微軟公司軟件開發策略的步伐,將某些應用程序和工具軟件由原先基於本地 Win32 的 C++ 代碼改造成基於 .NET 的受控代碼。我們的理由很多,但其中最根本的一條,就是為了解決內存溢出問題。基於受控代碼的軟件發生內存溢出問題的機率要小得多,因為受控代碼無法直接存取系統指針、寄存器或者內存。作為開發人員,你應該考慮(至少是打算)用受控代碼改寫某些應用程序或工具軟件。例如:企業管理工具就是很好的改寫對象之一。當然,你也應該很清楚,不可能在一夜之間把所有用 C++ 開發的軟件用 C# 之類的受控代碼語言改寫。

參考來源