什么是溢出_溢出的原因分析
黑客可通過溢出變量,使這個(gè)返回地址指向攻擊代碼,得到你電腦具有管理員資格的控制權(quán)。那么你對(duì)溢出解多少呢?以下是由學(xué)習(xí)啦小編整理關(guān)于什么是溢出的內(nèi)容,希望大家喜歡!
什么是溢出
溢出是黑客利用操作系統(tǒng)的漏洞,專門開發(fā)了一種程序,加相應(yīng)的參數(shù)運(yùn)行后,就可以得到你電腦具有管理員資格的控制權(quán),你在你自己電腦上能夠運(yùn)行的東西他可以全部做到,等于你的電腦就是他的了(別稱肉雞,也叫傀儡機(jī))。
溢出是程序設(shè)計(jì)者設(shè)計(jì)時(shí)的不足所帶來(lái)的錯(cuò)誤。
溢出的分類
緩沖區(qū)溢出
緩沖區(qū)是用戶為程序運(yùn)行時(shí)在計(jì)算機(jī)中申請(qǐng)的一段連續(xù)的內(nèi)存,它保存了給定類型的數(shù)據(jù)。緩沖區(qū)溢出指的是一種常見且危害很大的系統(tǒng)攻擊手段,通過向程序的緩沖區(qū)寫入超出其長(zhǎng)度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其他的指令,以達(dá)到攻擊的目的。更為嚴(yán)重的是,緩沖區(qū)溢出攻擊占了遠(yuǎn)程網(wǎng)絡(luò)攻擊的絕大多數(shù),這種攻擊可以使得一個(gè)匿名的Internet用戶有機(jī)會(huì)獲得一臺(tái)主機(jī)的部分或全部的控制權(quán)!由于這類攻擊使任何人都有可能取得主機(jī)的控制權(quán),所以它代表了一類極其嚴(yán)重的安全威脅。
緩沖區(qū)溢出攻擊的目的在于擾亂具有某些特權(quán)運(yùn)行的程序的功能,這樣可以使得攻擊者取得程序的控制權(quán),如果該程序具有足夠的權(quán)限,那么整個(gè)主機(jī)就被控制了。一般而言,攻擊者攻擊root程序,然后執(zhí)行類似“exec(sh)”的執(zhí)行代碼來(lái)獲得root的shell。為了達(dá)到這個(gè)目的,攻擊者必須達(dá)到如下的兩個(gè)目標(biāo):在程序的地址空間里安排適當(dāng)?shù)拇a;通過適當(dāng)?shù)爻跏蓟拇嫫骱痛鎯?chǔ)器,讓程序跳轉(zhuǎn)到事先安排的地址空間執(zhí)行。根據(jù)這兩個(gè)目標(biāo),可以將緩沖區(qū)溢出攻擊分為以下3類。
【緩沖區(qū)溢出分類】
控制程序轉(zhuǎn)移到攻擊代碼
這種方法指在改變程序的執(zhí)行流程,使之跳轉(zhuǎn)到攻擊代碼。最基本方法的就是溢出一個(gè)沒有邊界檢查或者其他弱點(diǎn)的緩沖區(qū),這樣就擾亂了程序的正常的執(zhí)行順序。通過溢出一個(gè)緩沖區(qū),攻擊者可以用近乎暴力的方法改寫相鄰的程序空間而直接跳過了系統(tǒng)的檢查。
1.2.1激活紀(jì)錄(Activation Records)
每當(dāng)一個(gè)函數(shù)調(diào)用發(fā)生時(shí),調(diào)用者會(huì)在堆棧中留下一個(gè)激活紀(jì)錄,它包含了函數(shù)結(jié)束時(shí)返回的地址。攻擊者通過溢出這些自動(dòng)變量,使這個(gè)返回地址指向攻擊代碼。通過改變程序的返回地址,當(dāng)函數(shù)調(diào)用結(jié)束時(shí),程序就跳轉(zhuǎn)到攻擊者設(shè)定的地址,而不是原先的地址。這類的緩沖區(qū)溢出被稱為“stack smashing attack”,是目.前常用的緩沖區(qū)溢出攻擊方式。
1.2.2函數(shù)指針(Function Pointers)
C語(yǔ)言中,“void (* foo)()”聲明了一個(gè)返回值為void函數(shù)指針的變量foo。函數(shù)指針可以用來(lái)定位任何地址空間,所以攻擊者只需在任何空間內(nèi)的函數(shù)指針附近找到一個(gè)能夠溢出的緩沖區(qū),然后溢出這個(gè)緩沖區(qū)來(lái)改變函數(shù)指針。在某一時(shí)刻,當(dāng)程序通過函數(shù)指針調(diào)用函數(shù)時(shí),程序的流程就按攻擊者的意圖實(shí)現(xiàn)了!它的一個(gè)攻擊范例就是在Linux系統(tǒng)下的super probe程序。
1.2.3長(zhǎng)跳轉(zhuǎn)緩沖區(qū)(Longjmp buffers)
在C語(yǔ)言中包含了一個(gè)簡(jiǎn)單的檢驗(yàn)/恢復(fù)系統(tǒng),稱為setjmp/longjmp。意思是在檢驗(yàn)點(diǎn)設(shè)定“setjmp(buffer)”,用“longjmp(buffer)”來(lái)恢復(fù)檢驗(yàn)點(diǎn)。然而,如果攻擊者能夠進(jìn)入緩沖區(qū)的空間,那么“longjmp(buffer)”實(shí)際上是跳轉(zhuǎn)到攻擊者的代碼。象函數(shù)指針一樣,longjmp緩沖區(qū)能夠指向任何地方,所以攻擊者所要做的就是找到一個(gè)可供溢出的緩沖區(qū)。一個(gè)典型的例子就是Perl 5.003,攻擊者首先進(jìn)入用來(lái)恢復(fù)緩沖區(qū)溢出的的longjmp緩沖區(qū),然后誘導(dǎo)進(jìn)入恢復(fù)模式,這樣就使Perl的解釋器跳轉(zhuǎn)到攻擊代碼上了!
最簡(jiǎn)單和常見的緩沖區(qū)溢出攻擊類型就是在一個(gè)字符串里綜合了代碼殖入和激活紀(jì)錄。攻擊者定位一個(gè)可供溢出的自動(dòng)變量,然后向程序傳遞一個(gè)很大的字符串,在引發(fā)緩沖區(qū)溢出改變激活紀(jì)錄的同時(shí)殖入了代碼。這個(gè)是由Levy指出的攻擊的模板。因?yàn)镃語(yǔ)言在習(xí)慣上只為用戶和參數(shù)開辟很小的緩沖區(qū),因此這種漏洞攻擊的實(shí)例不在少數(shù)。
代碼殖入和緩沖區(qū)溢出不一定要在一次動(dòng)作內(nèi)完成。攻擊者可以在一個(gè)緩沖區(qū)內(nèi)放置代碼,這是不能溢出緩沖區(qū)。然后,攻擊者通過溢出另外一個(gè)緩沖區(qū)來(lái)轉(zhuǎn)移程序的指針。這種方法一般用來(lái)解決可供溢出的緩沖區(qū)不夠大的情況。
如果攻擊者試圖使用已經(jīng)常駐的代碼而不是從外部殖入代碼,他們通常有必須把代碼作為參數(shù)化。舉例來(lái)說,在libc中的部分代碼段會(huì)執(zhí)行“exec(something)”,其中something就是參數(shù)。攻擊者然后使用緩沖區(qū)溢出改變程序的參數(shù),利用另一個(gè)緩沖區(qū)溢出使程序指針指向libc中的特定的代碼段。
內(nèi)存溢出
內(nèi)存溢出已經(jīng)是軟件開發(fā)歷史上存在了近40年的“老大難”問題,象在“紅色代碼”病毒事件中表現(xiàn)的那樣,它已經(jīng)成為黑客攻擊企業(yè)網(wǎng)絡(luò)的“罪魁禍?zhǔn)?rdquo;。
如在一個(gè)域中輸入的數(shù)據(jù)超過了它的要求就會(huì)引發(fā)數(shù)據(jù)溢出問題,多余的數(shù)據(jù)就可以作為指令在計(jì)算機(jī)上運(yùn)行。據(jù)有關(guān)安全小組稱,操作系統(tǒng)中超過50%的安全漏洞都是由內(nèi)存溢出引起的,其中大多數(shù)與微軟的技術(shù)有關(guān)。
微軟的軟件是針對(duì)臺(tái)式機(jī)開發(fā)的,內(nèi)存溢出不會(huì)帶來(lái)嚴(yán)重的問題。但現(xiàn)有臺(tái)式機(jī)一般都連上了互聯(lián)網(wǎng),內(nèi)存溢出就為黑客的入侵提供了便利條件。
數(shù)據(jù)溢出
在計(jì)算機(jī)中,當(dāng)要表示的數(shù)據(jù)超出計(jì)算機(jī)所使用的數(shù)據(jù)的表示范圍時(shí),則產(chǎn)生數(shù)據(jù)的溢出。
分析溢出原因
現(xiàn)實(shí)狀況
在幾乎所有計(jì)算機(jī)語(yǔ)言中,不管是新的語(yǔ)言還是舊的語(yǔ)言,使緩沖區(qū)溢出的任何嘗試通常都會(huì)被該語(yǔ)言本身自動(dòng)檢測(cè)并阻止(比如通過引發(fā)一個(gè)異常或根據(jù)需要給緩沖區(qū)添加更多空間)。但是有兩種語(yǔ)言不是這樣:C 和 C++ 語(yǔ)言。C 和 C++ 語(yǔ)言通常只是讓額外的數(shù)據(jù)亂寫到其余內(nèi)存的任何位置,而這種情況可能被利用從而導(dǎo)致恐怖的結(jié)果。更糟糕的是,用 C 和 C++ 編寫正確的代碼來(lái)始終如一地處理緩沖區(qū)溢出則更為困難;很容易就會(huì)意外地導(dǎo)致緩沖區(qū)溢出。除了 C 和 C++ 使用得 非常廣泛外,上述這些可能都是不相關(guān)的事實(shí);例如,Red Hat Linux 7.1 中 86% 的代碼行都是用 C 或 C ++ 編寫的。因此,大量的代碼對(duì)這個(gè)問題都是脆弱的,因?yàn)閷?shí)現(xiàn)語(yǔ)言無(wú)法保護(hù)代碼避免這個(gè)問題。
客觀原因
在 C 和 C++ 語(yǔ)言本身中,這個(gè)問題是不容易解決的。該問題基于 C 語(yǔ)言的根本設(shè)計(jì)決定(特別是 C 語(yǔ)言中指針和數(shù)組的處理方式)。由于 C++ 是最兼容的 C 語(yǔ)言超集,它也具有相同的問題。存在一些能防止這個(gè)問題的 C/C++ 兼容版本,但是它們存在極其嚴(yán)重的性能問題。而且一旦改變 C 語(yǔ)言來(lái)防止這個(gè)問題,它就不再是 C 語(yǔ)言了。許多語(yǔ)言(比如 Java 和 C#)在語(yǔ)法上類似 C,但它們實(shí)際上是不同的語(yǔ)言,將現(xiàn)有 C 或 C++ 程序改為使用那些語(yǔ)言是一項(xiàng)艱巨的任務(wù)。
普遍因素
然而,其他語(yǔ)言的用戶也不應(yīng)該沾沾自喜。有些語(yǔ)言存在允許緩沖區(qū)溢出發(fā)生的“轉(zhuǎn)義”子句。Ada 一般會(huì)檢測(cè)和防止緩沖區(qū)溢出(即針對(duì)這樣的嘗試引發(fā)一個(gè)異常),但是不同的程序可能會(huì)禁用這個(gè)特性。C# 一般會(huì)檢測(cè)和防止緩沖區(qū)溢出,但是它允許程序員將某些例程定義為“不安全的”,而這樣的代碼 可能 會(huì)導(dǎo)致緩沖區(qū)溢出。因此如果您使用那些轉(zhuǎn)義機(jī)制,就需要使用 C/C++ 程序所必須使用的相同種類的保護(hù)機(jī)制。許多語(yǔ)言都是用 C 語(yǔ)言來(lái)實(shí)現(xiàn)的(至少部分是用 C 語(yǔ)言來(lái)實(shí)現(xiàn)的 ),并且用任何語(yǔ)言編寫的所有程序本質(zhì)上都依賴用 C 或 C++ 編寫的庫(kù)。因此,所有程序都會(huì)繼承那些問題,所以了解這些問題是很重要的。
看過“溢出的原因分析”的人還看了:
5.端口漏洞有哪些