什么是溢出_溢出的原因分析
黑客可通過(guò)溢出變量,使這個(gè)返回地址指向攻擊代碼,得到你電腦具有管理員資格的控制權(quán)。那么你對(duì)溢出解多少呢?以下是由學(xué)習(xí)啦小編整理關(guān)于什么是溢出的內(nèi)容,希望大家喜歡!
什么是溢出
溢出是黑客利用操作系統(tǒng)的漏洞,專門開(kāi)發(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ū)溢出指的是一種常見(jiàn)且危害很大的系統(tǒng)攻擊手段,通過(guò)向程序的緩沖區(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;通過(guò)適當(dāng)?shù)爻跏蓟拇嫫骱痛鎯?chǔ)器,讓程序跳轉(zhuǎn)到事先安排的地址空間執(zhí)行。根據(jù)這兩個(gè)目標(biāo),可以將緩沖區(qū)溢出攻擊分為以下3類。
【緩沖區(qū)溢出分類】
控制程序轉(zhuǎn)移到攻擊代碼
這種方法指在改變程序的執(zhí)行流程,使之跳轉(zhuǎn)到攻擊代碼。最基本方法的就是溢出一個(gè)沒(méi)有邊界檢查或者其他弱點(diǎn)的緩沖區(qū),這樣就擾亂了程序的正常的執(zhí)行順序。通過(guò)溢出一個(gè)緩沖區(qū),攻擊者可以用近乎暴力的方法改寫相鄰的程序空間而直接跳過(guò)了系統(tǒng)的檢查。
1.2.1激活紀(jì)錄(Activation Records)
每當(dāng)一個(gè)函數(shù)調(diào)用發(fā)生時(shí),調(diào)用者會(huì)在堆棧中留下一個(gè)激活紀(jì)錄,它包含了函數(shù)結(jié)束時(shí)返回的地址。攻擊者通過(guò)溢出這些自動(dòng)變量,使這個(gè)返回地址指向攻擊代碼。通過(guò)改變程序的返回地址,當(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)程序通過(guò)函數(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)單和常見(jiàn)的緩沖區(qū)溢出攻擊類型就是在一個(gè)字符串里綜合了代碼殖入和激活紀(jì)錄。攻擊者定位一個(gè)可供溢出的自動(dòng)變量,然后向程序傳遞一個(gè)很大的字符串,在引發(fā)緩沖區(qū)溢出改變激活紀(jì)錄的同時(shí)殖入了代碼。這個(gè)是由Levy指出的攻擊的模板。因?yàn)镃語(yǔ)言在習(xí)慣上只為用戶和參數(shù)開(kāi)辟很小的緩沖區(qū),因此這種漏洞攻擊的實(shí)例不在少數(shù)。
代碼殖入和緩沖區(qū)溢出不一定要在一次動(dòng)作內(nèi)完成。攻擊者可以在一個(gè)緩沖區(qū)內(nèi)放置代碼,這是不能溢出緩沖區(qū)。然后,攻擊者通過(guò)溢出另外一個(gè)緩沖區(qū)來(lái)轉(zhuǎn)移程序的指針。這種方法一般用來(lái)解決可供溢出的緩沖區(qū)不夠大的情況。
如果攻擊者試圖使用已經(jīng)常駐的代碼而不是從外部殖入代碼,他們通常有必須把代碼作為參數(shù)化。舉例來(lái)說(shuō),在libc中的部分代碼段會(huì)執(zhí)行“exec(something)”,其中something就是參數(shù)。攻擊者然后使用緩沖區(qū)溢出改變程序的參數(shù),利用另一個(gè)緩沖區(qū)溢出使程序指針指向libc中的特定的代碼段。
內(nèi)存溢出
內(nèi)存溢出已經(jīng)是軟件開(kāi)發(fā)歷史上存在了近40年的“老大難”問(wèn)題,象在“紅色代碼”病毒事件中表現(xiàn)的那樣,它已經(jīng)成為黑客攻擊企業(yè)網(wǎng)絡(luò)的“罪魁禍?zhǔn)?rdquo;。
如在一個(gè)域中輸入的數(shù)據(jù)超過(guò)了它的要求就會(huì)引發(fā)數(shù)據(jù)溢出問(wèn)題,多余的數(shù)據(jù)就可以作為指令在計(jì)算機(jī)上運(yùn)行。據(jù)有關(guān)安全小組稱,操作系統(tǒng)中超過(guò)50%的安全漏洞都是由內(nèi)存溢出引起的,其中大多數(shù)與微軟的技術(shù)有關(guān)。
微軟的軟件是針對(duì)臺(tái)式機(jī)開(kāi)發(fā)的,內(nèi)存溢出不會(huì)帶來(lái)嚴(yán)重的問(wè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è)并阻止(比如通過(guò)引發(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è)問(wèn)題都是脆弱的,因?yàn)閷?shí)現(xiàn)語(yǔ)言無(wú)法保護(hù)代碼避免這個(gè)問(wèn)題。
客觀原因
在 C 和 C++ 語(yǔ)言本身中,這個(gè)問(wèn)題是不容易解決的。該問(wèn)題基于 C 語(yǔ)言的根本設(shè)計(jì)決定(特別是 C 語(yǔ)言中指針和數(shù)組的處理方式)。由于 C++ 是最兼容的 C 語(yǔ)言超集,它也具有相同的問(wèn)題。存在一些能防止這個(gè)問(wèn)題的 C/C++ 兼容版本,但是它們存在極其嚴(yán)重的性能問(wèn)題。而且一旦改變 C 語(yǔ)言來(lái)防止這個(gè)問(wèn)題,它就不再是 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ì)繼承那些問(wèn)題,所以了解這些問(wèn)題是很重要的。
看過(guò)“溢出的原因分析”的人還看了:
5.端口漏洞有哪些