❶ 緩沖區溢出攻擊的6.防範方法
有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。
1、通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。
2、強制寫正確的代碼的方法。
3、利用編譯器的邊界檢查來實現緩沖區的保護。這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。
4、一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩沖區溢出失效,但它能阻止絕大多數的緩沖區溢出攻擊。分析這種保護方法的兼容性和性能優勢。
非執行的緩沖區
通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。在早期的Unix系統設計中,只允許程序代碼在代碼段中執行。
但是Unix和MS Windows系統由於要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,這也是緩沖區溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。
但是可以設定堆棧數據段不可執行,這樣就可以保證程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:
⑴信號傳遞
Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼來實現向進程發送Unix信號。非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的。
⑵GCC的在線重用
研究發現gcc在堆棧區里放置了可執行的代碼作為在線重用之用。然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。
非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其它形式的攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其它的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。
(1)緩存溢出攻擊代碼擴展閱讀:
原理
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。
例如下面程序:
void function(char*str){char buffer[16];strcpy(buffer,str);}
上面的strcpy()將直接把str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。
存在像strcpy這樣的問題的標准函數還有strcat()、sprintf()、vsprintf()、gets()、scanf()等。
當然,隨便往緩沖區中填東西造成它溢出一般只會出現分段錯誤(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過製造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。
如果該程序屬於root且有suid許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。
而且,緩沖區溢出成為遠程攻擊的主要手段其原因在於緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。在ugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。
緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。
❷ 如何理解緩沖區溢出攻擊
緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。由於C語言本身缺乏邊界檢查,同時很多編程人員更注重程序運行時的性能(邊界檢查會降低性能),因此利用C語言等開發工具開發的軟體系統普遍存在著緩沖區溢出漏洞。最早的緩沖區溢出攻擊是著名的Robert Morris的網際網路蠕蟲。1988年,Morris利用fingered程序不限制長度的漏洞使緩沖區溢出,成功地獲得了一個脆弱系統的存取許可權,獲得許可權後Morris的程序會在機器上自動安裝,並且千方百計去感染其他機器。結果造成互聯網上6000餘台伺服器癱瘓,占當時聯網總數的10%。雖然人們認識到了緩沖區溢出的嚴重危害,但由於一些不好的編程習慣,新的緩沖區溢出漏洞仍然層出不窮。
緩沖區溢出的原理
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()將直接把str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
當然,隨便往緩沖區中填東西造成它溢出一般只會出現「分段錯誤」(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過製造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序屬於root且有suid許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見的安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出漏洞給予了攻擊者想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
緩沖區溢出攻擊有很多種形式,相應的防衛手段也隨著攻擊方法的不同而不同,下面將介紹這兩方面的內容。
❸ java中可以實現緩沖區溢出攻擊嗎
不可以實現緩沖區溢出攻擊;
純java代碼是不會有緩沖區溢出漏洞的,因為java中是全自動內存管理了,用戶無法控制內存的分配與釋放.
緩沖區溢出攻擊是利用緩沖區溢出漏洞所進行的攻擊行動。緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統關機、重新啟動等後果。
緩沖區溢出是指當計算機向緩沖區內填充數據位數時超過了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。理想的情況是:程序會檢查數據長度,而且並不允許輸入超過緩沖區長度的字元。但是絕大多數程序都會假設數據長度總是與所分配的儲存空間相匹配,這就為緩沖區溢出埋下隱患。
❹ 方舟傳出可靠緩沖區溢出
緩沖區溢出的目的在於擾亂具有某些特權運行程序的功能,這樣就可以讓攻擊者取得程序的控制權,從而進行緩沖區溢出攻擊行為。假如該程序具有足夠的許可權,那麼整個主機甚至伺服器就被控制了。
解決緩沖區溢出方法:1.植人法:攻擊者向被攻擊的程序輸人一個字元串,程序會把這個字元串放到緩沖區里。這個字元串所包含的數據是可以在這個被攻擊的硬體平台運行的指令流。在這里攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。
2.利用已經存在的代碼:很多時候攻擊者所要的代碼已經存在於被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數,然後使程序跳轉到想要執行的代碼那裡。比方說,攻擊代碼要求執行「ex-ec("/bin/sh")",而在libc庫中的代碼執行「exec(arg)",其中arg是一個指向字元串的指針參數,那麼攻擊者只要把傳人的參數指針改為指向「/bin/sh",然後跳轉到libc庫中相應的指令序列即可。
❺ 如何防範Linux操作系統下緩沖區溢出攻擊 黑客武林
雖然Linux病毒屈指可數,但是基於緩沖區溢出(BufferOverflow)漏洞的攻擊還是讓眾多Linux用戶大吃一驚。所謂「世界上第一個Linux病毒」??reman,嚴格地說並不是真正的病毒,它實質上是一個古老的、在Linux/Unix(也包括Windows等系統)世界中早已存在的「緩沖區溢出」攻擊程序。reman只是一個非常普通的、自動化了的緩沖區溢出程序,但即便如此,也已經在Linux界引起很大的恐慌。
緩沖區溢出漏洞是一個困擾了安全專家30多年的難題。簡單來說,它是由於編程機制而導致的、在軟體中出現的內存錯誤。這樣的內存錯誤使得黑客可以運行一段惡意代碼來破壞系統正常地運行,甚至獲得整個系統的控制權。
Linux系統特性
利用緩沖區溢出改寫相關內存的內容及函數的返回地址,從而改變代碼的執行流程,僅能在一定許可權范圍內有效。因為進程的運行與當前用戶的登錄許可權和身份有關,僅僅能夠製造緩沖區溢出是無法突破系統對當前用戶的許可權設置的。因此盡管可以利用緩沖區溢出使某一程序去執行其它被指定的代碼,但被執行的代碼只具有特定的許可權,還是無法完成超越許可權的任務。
但是,Linux(包括Unix)系統本身的一些特性卻可以被利用來沖破這種許可權的局限性,使得能夠利用緩沖區溢出獲得更高的、甚至是完全的許可權。主要體現在如下兩方面:
1.Linux(包括Unix)系統通過設置某可執行文件的屬性為SUID或SGID,允許其它用戶以該可執行文件擁有者的用戶ID或用戶組ID來執行它。如果該可執行文件的屬性是root,同時文件屬性被設置為SUID,則該可執行文件就存在可利用的緩沖區溢出漏洞,可以利用它以root的身份執行特定的、被另外安排的代碼。既然能夠使得一個具有root許可權的代碼得以執行,就能夠產生一個具有超級用戶root許可權的Shell,那麼掌握整個系統的控制權的危險就產生了。
2.Linux(包括Unix)中的許多守護進程都是以root許可權運行。如果這些程序存在可利用的緩沖區溢出,即可直接使它以root身份去執行另外安排的代碼,而無須修改該程序的SUID或SGID屬性。這樣獲得系統的控制權將更加容易。
隨著現代網路技術的發展和網路應用的深入,計算機網路所提供的遠程登錄機制、遠程調用及執行機制是必須的。這使得一個匿名的Internet用戶有機會利用緩沖區溢出漏洞來獲得某個系統的部分或全部控制權。實際上,以緩沖區溢出漏洞為攻擊手段的攻擊佔了遠程網路攻擊中的絕大多數,這給Linux系統帶來了極其嚴重的安全威脅。
途徑分析
通常情況下攻擊者會先攻擊root程序,然後利用緩沖區溢出時發生的內存錯誤來執行類似「exec(sh)」的代碼,從而獲得root的一個Shell。為了獲得root許可權的Shell,攻擊者需要完成如下的工作:
1.在程序的地址空間內安排適當的特定代碼。一般使用如下兩種方法在被攻擊的程序地址空間內安排攻擊代碼。
2.通過適當地初始化寄存器和存儲器,使程序在發生緩沖區溢出時不能回到原來的執行處,而是跳轉到被安排的地址空間執行。
當攻擊者找到一種途徑可以變原程序的執行代碼和流程時,攻擊的危險就產生了。
共2頁: 1 [2]
內容導航
第 1 頁:Linux系統特性
防範措施
Linux下的緩沖區溢出攻擊威脅既來自於軟體的編寫機制,也來自於Linux(和Unix)系統本身的特性。實際上,緩沖區溢出攻擊及各種計算機病毒猖獗的根本原因在於現代計算機系統都是採用馮?諾依曼「存儲程序」的工作原理。這一基本原理使得程序和數據都可以在內存中被繁殖、拷貝和執行。因此,要想有效地防範緩沖區溢出攻擊就應該從這兩個方面雙管其下。
確保代碼正確安全
緩沖區溢出攻擊的根源在於編寫程序的機制。因此,防範緩沖區溢出漏洞首先應該確保在Linux系統上運行的程序(包括系統軟體和應用軟體)代碼的正確性,避免程序中有不檢查變數、緩沖區大小及邊界等情況存在。比如,使用grep工具搜索源代碼中容易產生漏洞的庫調用,檢測變數的大小、數組的邊界、對指針變數進行保護,以及使用具有邊界、大小檢測功能的C編譯器等。
基於一定的安全策略設置系統
攻擊者攻擊某一個Linux系統,必須事先通過某些途徑對要攻擊的系統做必要的了解,如版本信息等,然後再利用系統的某些設置直接或間接地獲取控制權。因此,防範緩沖區溢出攻擊的第二個方面就是對系統設置實施有效的安全策略。這些策略種類很多,由於篇幅有限只列舉幾個典型措施:
(1)在裝有Telnet服務的情況下,通過手工改寫「/etc/inetd.conf」文件中的Telnet設置,使得遠程登錄的用戶無法看到系統的提示信息。具體方法是將Telnet設置改寫為:
telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h
末尾加上「-h」參數可以讓守護進程不顯示任何系統信息,只顯示登錄提示。
(2)改寫「rc.local」文件。默認情況下,當登錄Linux系統時系統運行rc.local文件,顯示該Linux發行版本的名字、版本號、內核版本和伺服器名稱等信息,這使得大量系統信息被泄露。將「rc.local」文件中顯示這些信息的代碼注釋掉,可以使系統不顯示這些信息。
一種方法是在顯示這-些信息的代碼行前加「#」:
……# echo 「」>/etc/issue# echo 「$R」>>/etc/issue#echo」Kernel $ (uname -r)on $a $(uname -m)」>>/etc/issue##echo>>/etc/issue……
另一種方法是將保存有系統信息的文件/etc/issue.net和issue刪除。這兩個文件分別用於在遠程登錄和本地登錄時向用戶提供相關信息。刪除這兩個文件的同時,仍需要完成方法一中的注釋工作,否則,系統在啟動時將會自動重新生成這兩個文件。
(3)禁止提供finger服務。在Linux系統中,使用finger命令可以顯示本地或遠程系統中目前已登錄用戶的詳細信息。禁止提供finger服務的有效方法是,通過修改該文件屬性、許可權(改為600)使得只有root用戶才可以執行該命令。
(4)處理「inetd.conf」文件。Linux系統通過inetd(超級伺服器)程序根據網路請求裝入網路程序。該程序通過「/etc/inetd.conf」文件獲得inetd在監聽哪些網路埠,為每個埠啟動哪些特定服務等信息。因此,該文件同樣會泄露大量的敏感信息。解決問題的方法是,通過將其許可權改為600隻允許root用戶訪問,並通過改寫「/etc/inetd.conf」文件將不需要的服務程序禁止掉,最後修改該文件的屬性使其不能被修改。
總結
緩沖區溢出攻擊之所以能成為一種常見的攻擊手段,其原因在於緩沖區溢出漏洞太普遍,且易於實現攻擊,因此緩沖區溢出問題一直是個難題。
所幸的是,OpenBSD開發組為解決這一安全難題採用了三種新的有效策略。相信不久的將來,Linux用戶可以不再為緩沖區溢出攻擊而寢食難安了。
RAR文件在Linux下用起來
要在Linux下處理.rar文件,需要安裝RARforLinux。該軟體可以從網上下載,但要記住,它不是免費的。大家可從http://www.onlinedown.net/sort/125_1.htm下載RARforLinux 3.2.0,然後用下面的命令安裝:
# tar -xzpvf rarlinux-3.2.0.tar.gz
# cd rar
# make
安裝後就有了rar和unrar這兩個程序,rar是壓縮程序,unrar是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
# rar a all *.mp3
這條命令是將所有.mp3的文件壓縮成一個rar包,名為all.rar,該程序會將.rar 擴展名將自動附加到包名後。
# unrar e all.rar
這條命令是將all.rar中的所有文件解壓出來。
❻ 緩沖區溢出攻擊的基本流程
我一般是這樣做的
1 尋找系統漏洞。尋找可以照成緩沖區溢出的漏洞。當然這要在你以精確目標,對目標有一定了解的基礎上。比如目標的操作系統,開啟服務,長駐程序(這個肯定是管理員用戶開啟的程序)。可以網上查,最好別自己去找,這個憑空找,一般比較難,也很麻煩。很多國外的黑客網站會公布最新漏洞,E語不方便國內也有一些,不過國內比較慢。當然也有一些所謂的工具可以掃描出來,不過除非你沒固定目標攻擊誰都行,否則對固定目標掃描一般沒啥大用。
2 反匯編了漏洞部分代碼。如果是開源系統或程序,反匯編獲得溢出的棧地址,即調用函數後返回的函數指針地址。
這個第一次做會比較難,最好找人指導你一下,當然你也可以找我,免費,不過你要有一定的GDB和匯編語言基礎才行。(不用太強,會一點皮毛就行,因為我也強不哪去),當然相當一部分公布的漏洞這些會隨之公布。
3 編寫緩沖溢出地址對應的執行代碼,然後通過緩沖區溢出漏洞把棧內函數返回的地址對應到你這段執行函數上。這個你要之前就寫好。針對你的目的,可以是給自己提權,或者拷貝個文件什麼的,看你自己愛好了,win 和 linux下用EXE系的函數執行SHELL或直接系統調用就行了,反正這時你已經有管理員許可權了。這類代碼不想寫網上也有很多且原理非常簡單。
4 掃尾。特別是大網站或大公司的伺服器,不想人家發現別忘了把改的東西改回來,當然你可以手動創造一個帶漏洞的程序,然後定時以管理員許可權運行,為下次進入做准備。這樣的程序一般殺毒軟體都不是很敏感(只要你別去改人家密碼),定時運行,別讓人家看到進程就行啦。
以上 這個只是最簡單的原理性步驟 高手們會在這個基礎上運用很多高超的技巧 當然具體問題還要因地制宜 這就不是一兩句話能說清楚啦 希望對你有幫助
請遵守當地法律 不要從事違法活動
❼ 什麼是溢出_溢出的原因分析
黑客可通過溢出變數,使這個返回地址指向攻擊代碼,得到你電腦具有管理員資格的控制權。那麼你對溢出解多少呢?以下是由我整理關於什麼是溢出的內容,希望大家喜歡!
什麼是溢出
溢出是黑客利用 操作系統 的漏洞,專門開發了一種程序,加相應的參數運行後,就可以得到你電腦具有管理員資格的控制權,你在你自己電腦上能夠運行的東西他可以全部做到,等於你的電腦就是他的了(別稱肉雞,也叫傀儡機)。
溢出是程序設計者設計時的不足所帶來的錯誤。
溢出的分類緩沖區溢出
緩沖區是用戶為程序運行時在計算機中申請的一段連續的內存,它保存了給定類型的數據。緩沖區溢出指的是一種常見且危害很大的系統攻擊手段,通過向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他的指令,以達到攻擊的目的。更為嚴重的是,緩沖區溢出攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權!由於這類攻擊使任何人都有可能取得主機的控制權,所以它代表了一類極其嚴重的安全威脅。
緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似“exec(sh)”的執行代碼來獲得root的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:在程序的地址空間里安排適當的代碼;通過適當地初始化寄存器和存儲器,讓程序跳轉到事先安排的地址空間執行。根據這兩個目標,可以將緩沖區溢出攻擊分為以下3類。
【緩沖區溢出分類】
控製程序轉移到攻擊代碼
這種 方法 指在改變程序的執行流程,使之跳轉到攻擊代碼。最基本方法的就是溢出一個沒有邊界檢查或者其他弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出一個緩沖區,攻擊者可以用近乎暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。
1.2.1激活紀錄(Activation Records)
每當一個函數調用發生時,調用者會在堆棧中留下一個激活紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出這些自動變數,使這個返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為“stack smashing attack”,是目.前常用的緩沖區溢出攻擊方式。
1.2.2函數指針(Function Pointers)
C語言中,“void (* foo)()”聲明了一個返回值為void函數指針的變數foo。函數指針可以用來定位任何地址空間,所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了!它的一個攻擊範例就是在Linux系統下的super probe程序。
1.2.3長跳轉緩沖區(Longjmp buffers)
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定“setjmp(buffer)”,用“longjmp(buffer)”來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麼“longjmp(buffer)”實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。一個典型的例子就是Perl 5.003,攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了!
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼殖入和激活紀錄。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出改變激活紀錄的同時殖入了代碼。這個是由Levy指出的攻擊的模板。因為C語言在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例不在少數。
代碼殖入和緩沖區溢出不一定要在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部殖入代碼,他們通常有必須把代碼作為參數化。舉例來說,在libc中的部分代碼段會執行“exec(something)”,其中something就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。
內存溢出
內存溢出已經是軟體開發歷史上存在了近40年的“老大難”問題,象在“紅色代碼”病毒事件中表現的那樣,它已經成為黑客攻擊企業網路的“罪魁禍首”。
如在一個域中輸入的數據超過了它的要求就會引發數據溢出問題,多餘的數據就可以作為指令在計算機上運行。據有關安全小組稱,操作系統中超過50%的安全漏洞都是由內存溢出引起的,其中大多數與微軟的技術有關。
微軟的軟體是針對 台式機 開發的,內存溢出不會帶來嚴重的問題。但現有台式機一般都連上了互聯網,內存溢出就為黑客的入侵提供了便利條件。
數據溢出
在計算機中,當要表示的數據超出計算機所使用的數據的表示範圍時,則產生數據的溢出。
分析溢出原因現實狀況
在幾乎所有計算機語言中,不管是新的語言還是舊的語言,使緩沖區溢出的任何嘗試通常都會被該語言本身自動檢測並阻止(比如通過引發一個異常或根據需要給緩沖區添加更多空間)。但是有兩種語言不是這樣: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++ 程序改為使用那些語言是一項艱巨的任務。
普遍因素
❽ 緩沖區溢出的攻擊
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。
下面通過一個示例來詳細看看什麼是緩沖區溢出。程序的緩沖區就像一個個格子,每個格子中存放不同的東西,有的是命令,有的是數據,當程序需要接收用戶數據,程序預先為之分配了4個格子(下圖1中黃色的0~3號格子)。按照程序設計,就是要求用戶輸入的數據不超過4個。而用戶在輸入數據時,假設輸入了16個數據,而且程序也沒有對用戶輸入數據的多少進行檢查,就往預先分配的格子中存放,這樣不僅4個分配的格子被使用了,其後相鄰的12個格子中的內容都被新數據覆蓋了。這樣原來12個格子中的內容就丟失了。這時就出現了緩沖區(0~3號格子)溢出了。
在上面示例的基礎上來看一個代碼實例,程序如下:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()將直接把str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
當然,隨便往緩沖區中填東西造成它溢出一般只會出現「分段錯誤」(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過製造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序有root或者suid執行許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出成為遠程攻擊的主要手段其原因在於緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。在Bugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。
緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。 緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行代碼來獲得root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
1. 在程序的地址空間里安排適當的代碼。
2. 通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
可以根據這兩個目標來對緩沖區溢出攻擊進行分類。
❾ 用C語言寫一段程序,模擬函數緩沖區溢出攻擊(buffer overrun)。
這個基本上沒辦法給你寫例子,受編譯環境影響太大。
原理很單純,就是把函數局部變數作為基址可以直接修改函數的返回地址。用匯編很好辦,但C的話很多必要地址只能編譯好了才能知道。
----
VS2008 Debug模式編譯 關閉Incremental Linking
#include <stdio.h>
void foo();
// __stdcall為了foo2在返回的時候清理foo1調用時候的參數,因為是通過返回進入foo2的,所以foo1的返回地址已經出棧,現在棧里還剩下foo1的兩個參數,我們需要第一個參數的位置作為foo2的返回值
// 於是還剩一個參數的位置,foo2也有一個參數,利用__stdcall自己清理參數的特性就可以把剩下的那個參數清理掉。然後我們直接返回到foo1調用後清理參數的代碼之後,避免棧混亂。
void __stdcall foo2(void *mmy)
{
printf("foo2...\n當前返回地址: %.8X,位於: %.8X\n", *(&mmy - 1), &mmy - 1);
*(int *)(&mmy - 1) = (int)foo + 0x3A; // 這里的0x3A只有編譯後看生成的匯編才能得到。
printf("替換返回地址為foo1返回並清理堆棧後...\n當前返回地址: %.8X,位於: %.8X\n", *(&mmy - 1), &mmy - 1);
}
void foo1(int in_offset, int in_data)
{
int buf[0x10];
printf("foo1...\n當前返回地址: %.8X,位於: %.8X\n", *((void **)&in_offset - 1), (void **)&in_offset - 1);
buf[in_offset] = in_data; // 這里buf + in_offset指向的是foo1的返回地址,foo1返回的時候會跳轉的foo2的入口
printf("替換...\n當前返回地址: %.8X,位於: %.8X\n", *((void **)&in_offset - 1), (void **)&in_offset - 1);
}
void foo()
{
printf("foo...\n調用foo1, 通過非法索引將foo1返回地址替換為foo2人口...\n");
foo1(18, (int)foo2); // 這里的18是返回地址相對buf的偏移量,只有編譯之後才能獲得。VC環境下Debug模式是16個buf元素+1個保護數據+1個過去的幀指針。
}
void main()
{
foo();
}
❿ 緩沖區溢出攻擊的基本原理是什麼
緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。緩沖區溢出攻擊有多種英文名稱:bufferoverflow,bufferoverrun,smashthestack,trashthestack,scribblethestack,manglethestack,memoryleak,overrunscrew;它們指的都是同一種攻擊手段。第一個緩沖區溢出攻擊--Morris蠕蟲,發生在十年前,它曾造成了全世界6000多台網路伺服器癱瘓。
1.概念
緩沖區溢出是指當計算機向緩沖區內填充數據位數時超過了緩沖區本身的容量溢出的數據覆蓋在合法數據上,理想的情況是程序檢查數據長度並不允許輸入超過緩沖區長度的字元,但是絕大多數程序都會假設數據長度總是與所分配的儲存空間想匹配,這就為緩沖區溢出埋下隱患.操作系統所使用的緩沖區又被稱為"堆棧".在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩沖區溢出。
2.危害
在當前網路與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後為所欲為。
3.緩沖區攻擊
一.緩沖區溢出的原理
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
voidfunction(char*str){
charbuffer[16];
strcpy(buffer,str);
}
上面的strcpy()將直接吧str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
當然,隨便往緩沖區中填東西造成它溢出一般只會出現「分段錯誤」(Segmentationfault),而不能達到攻擊的目的。最常見的手段是通過製造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序屬於root且有suid許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出成為遠程攻擊的主要手段其原因在於緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。在Bugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。
緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。
二、緩沖區溢出的漏洞和攻擊
緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行代碼來獲得root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
1.在程序的地址空間里安排適當的代碼。
2.通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
根據這兩個目標來對緩沖區溢出攻擊進行分類。在二.1節,將描述攻擊代碼是如何放入被攻擊程序的地址空間的。在二.2節,將介紹攻擊者如何使一個程序的緩沖區溢出,並且執行轉移到攻擊代碼(這個就是「溢出」的由來)。在二.3節,將綜合前兩節所討論的代碼安排和控製程序執行流程的技術。
二.1在程序的地址空間里安排適當的代碼的方法
有兩種在被攻擊程序地址空間里安排攻擊代碼的方法:
1、植入法:
攻擊者向被攻擊的程序輸入一個字元串,程序會把這個字元串放到緩沖區里。這個字元串包含的資料是可以在這個被攻擊的硬體平台上運行的指令序列。在這里,攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。緩沖區可以設在任何地方:堆棧(stack,自動變數)、堆(heap,動態分配的內存區)和靜態資料區。
2、利用已經存在的代碼:
有時,攻擊者想要的代碼已經在被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數。比如,攻擊代碼要求執行「exec(「/bin/sh」)」,而在libc庫中的代碼執行「exec(arg)」,其中arg使一個指向一個字元串的指針參數,那麼攻擊者只要把傳入的參數指針改向指向」/bin/sh」。
二.2控製程序轉移到攻擊代碼的方法
所有的這些方法都是在尋求改變程序的執行流程,使之跳轉到攻擊代碼。最基本的就是溢出一個沒有邊界檢查或者其它弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出一個緩沖區,攻擊者可以用暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。
分類的基準是攻擊者所尋求的緩沖區溢出的程序空間類型。原則上是可以任意的空間。實際上,許多的緩沖區溢出是用暴力的方法來尋求改變程序指針的。這類程序的不同之處就是程序空間的突破和內存空間的定位不同。主要有以下三種:1、活動紀錄(ActivationRecords):
每當一個函數調用發生時,調用者會在堆棧中留下一個活動紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出堆棧中的自動變數,使返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為堆棧溢出攻擊(StackSmashingAttack),是目前最常用的緩沖區溢出攻擊方式。
2、函數指針(FunctionPointers):
函數指針可以用來定位任何地址空間。例如:「void(*foo)()」聲明了一個返回值為void的函數指針變數foo。所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了。它的一個攻擊範例就是在Linux系統下的superprobe程序。
3、長跳轉緩沖區(Longjmpbuffers):
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定「setjmp(buffer)」,用「longjmp(buffer)」來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麼「longjmp(buffer)」實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。一個典型的例子就是Perl5.003的緩沖區溢出漏洞;攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了。
二.3代碼植入和流程式控制制技術的綜合分析
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼植入和活動紀錄技術。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出,改變活動紀錄的同時植入了代碼。這個是由Levy指出的攻擊的模板。因為C在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例十分常見。
代碼植入和緩沖區溢出不一定要在在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出的緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大(不能放下全部的代碼)的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部植入代碼,他們通常必須把代碼作為參數調用。舉例來說,在libc(幾乎所有的C程序都要它來連接)中的部分代碼段會執行「exec(something)」,其中somthing就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,然後利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。
三、緩沖區溢出攻擊的實驗分析
2000年1月,Cerberus安全小組發布了微軟的IIS4/5存在的一個緩沖區溢出漏洞。攻擊該漏洞,可以使Web伺服器崩潰,甚至獲取超級許可權執行任意的代碼。目前,微軟的IIS4/5是一種主流的Web伺服器程序;因而,該緩沖區溢出漏洞對於網站的安全構成了極大的威脅;它的描述如下:
瀏覽器向IIS提出一個HTTP請求,在域名(或IP地址)後,加上一個文件名,該文件名以「.htr」做後綴。於是IIS認為客戶端正在請求一個「.htr」文件,「.htr」擴展文件被映像成ISAPI(InternetServiceAPI)應用程序,IIS會復位向所有針對「.htr」資源的請求到ISM.DLL程序,ISM.DLL打開這個文件並執行之。
瀏覽器提交的請求中包含的文件名存儲在局部變數緩沖區中,若它很長,超過600個字元時,會導致局部變數緩沖區溢出,覆蓋返回地址空間,使IIS崩潰。更進一步,在如圖1所示的2K緩沖區中植入一段精心設計的代碼,可以使之以系統超級許可權運行。
四、緩沖區溢出攻擊的防範方法
緩沖區溢出攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權。如果能有效地消除緩沖區溢出的漏洞,則很大一部分的安全威脅可以得到緩解。
目前有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。在四.1中介紹了通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。在四.2中介紹了強制寫正確的代碼的方法。在四.3中介紹了利用編譯器的邊界檢查來實現緩沖區的保護。這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。在四.4中介紹一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩沖區溢出失效,但它能阻止絕大多數的緩沖區溢出攻擊。然後在四.5,分析這種保護方法的兼容性和性能優勢。
四.1非執行的緩沖區
通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。在早期的Unix系統設計中,只允許程序代碼在代碼段中執行。但是近來的Unix和MSWindows系統由於要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,這也是緩沖區溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。
但是可以設定堆棧數據段不可執行,這樣就可以保證程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:
(1)信號傳遞:
Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼來實現向進程發送Unix信號。非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的。
(2)GCC的在線重用:
研究發現gcc在堆棧區里放置了可執行的代碼作為在線重用之用。然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。
非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其它形式的攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其它的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。
四.2編寫正確的代碼
編寫正確的代碼是一件非常有意義的工作,特別象編寫C語言那種風格自由而容易出錯的程序,這種風格是由於追求性能而忽視正確性的傳統引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。
最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,比如對strcpy和sprintf的調用,這兩個函數都沒有檢查輸入參數的長度。事實上,各個版本C的標准庫均有這樣的問題存在。
此外,人們還開發了一些高級的查錯工具,如faultinjection等。這些工具的目的在於通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞。還有一些靜態分析工具用於偵測緩沖區溢出的存在。
雖然這些工具幫助程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在。