導航:首頁 > 源碼編譯 > 緩沖區漏洞安全編譯選項

緩沖區漏洞安全編譯選項

發布時間:2022-09-28 04:43:16

① 如何利用緩沖區的漏洞作一些實質性的東西

如何開啟系統埠

--------------------------------------------------------------------------------
win本身大部分的埠應該都是開的吧,只能是關哪個埠。

試試這片文章:
查看埠
在Windows 2000/XP/Server 2003中要查看埠,可以使用Netstat命令

依次點擊「開始→運行」,鍵入「cmd」並回車,打開命令提示符窗口。在命令提示符狀態下鍵入「netstat -a -n」,按下回車鍵後就可以看到以數字形式顯示的TCP和UDP連接的埠號及狀態。

小知識:Netstat命令用法
命令格式:Netstat �-a� �-e� �-n� �-o� �-s�

-a 表示顯示所有活動的TCP連接以及計算機監聽的TCP和UDP埠。

-e 表示顯示乙太網發送和接收的位元組數、數據包數等。

-n 表示只以數字形式顯示所有活動的TCP連接的地址和埠號。

-o 表示顯示活動的TCP連接並包括每個連接的進程ID(PID)。

-s 表示按協議顯示各種連接的統計信息,包括埠號。

關閉/開啟埠
在介紹各種埠的作用前,這里先介紹一下在Windows中如何關閉/打開埠,因為默認的情況下,有很多不安全的或沒有什麼用的埠是開啟的,比如Telnet服務的23埠、FTP服務的21埠、SMTP服務的25埠、RPC服務的135埠等等。為了保證系統的安全性,我們可以通過下面的方法來關閉/開啟埠。

關閉埠
比如在Windows 2000/XP中關閉SMTP服務的25埠,可以這樣做:首先打開「控制面板」,雙擊「管理工具」,再雙擊「服務」。接著在打開的服務窗口中找到並雙擊「Simple Mail Transfer Protocol (SMTP)」服務,單擊「停止」按鈕來停止該服務,然後在「啟動類型」中選擇「已禁用」,最後單擊「確定」按鈕即可。這樣,關閉了SMTP服務就相當於關閉了對應的埠。

開啟埠
如果要開啟該埠只要先在「啟動類型」選擇「自動」,單擊「確定」按鈕,再打開該服務,在「服務狀態」中單擊「啟動」按鈕即可啟用該埠,最後,單擊「確定」按鈕即可。

21埠:21埠主要用於FTP(File Transfer Protocol,文件傳輸協議)服務。 23埠:23埠主要用於Telnet(遠程登錄)服務,是Internet上普遍採用的登錄和模擬程序。 25埠:25埠為SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)伺服器所開放,主要用於發送郵件,如今絕大多數郵件伺服器都使用該協議。 53埠:53埠為DNS(Domain Name Server,域名伺服器)伺服器所開放,主要用於域名解析,DNS服務在NT系統中使用的最為廣泛。 67、68埠:67、68埠分別是為Bootp服務的Bootstrap Protocol Server(引導程序協議服務端)和Bootstrap Protocol Client(引導程序協議客戶端)開放的埠。 69埠:TFTP是Cisco公司開發的一個簡單文件傳輸協議,類似於FTP。 79埠:79埠是為Finger服務開放的,主要用於查詢遠程主機在線用戶、操作系統類型以及是否緩沖區溢出等用戶的詳細信息。 80埠:80埠是為HTTP(HyperText Transport Protocol,超文本傳輸協議)開放的,這是上網沖浪使用最多的協議,主要用於在WWW(World Wide Web,萬維網)服務上傳輸信息的協議。 99埠:99埠是用於一個名為「Metagram Relay」(亞對策延時)的服務,該服務比較少見,一般是用不到的。 109、110埠:109埠是為POP2(Post Office Protocol Version 2,郵局協議2)服務開放的,110埠是為POP3(郵件協議3)服務開放的,POP2、POP3都是主要用於接收郵件的。 111埠:111埠是SUN公司的RPC(Remote Procere Call,遠程過程調用)服務所開放的埠,主要用於分布式系統中不同計算機的內部進程通信,RPC在多種網路服務中都是很重要的組件。 113埠:113埠主要用於Windows的「Authentication Service」(驗證服務)。 119埠:119埠是為「Network News Transfer Protocol」(網路新聞組傳輸協議,簡稱NNTP)開放的。 135埠:135埠主要用於使用RPC(Remote Procere Call,遠程過程調用)協議並提供DCOM(分布式組件對象模型)服務。 137埠:137埠主要用於「NetBIOS Name Service」(NetBIOS名稱服務)。 139埠:139埠是為「NetBIOS Session Service」提供的,主要用於提供Windows文件和列印機共享以及Unix中的Samba服務。 143埠:143埠主要是用於「Internet Message Access Protocol」v2(Internet消息訪問協議,簡稱IMAP)。 161埠:161埠是用於「Simple Network Management Protocol」(簡單網路管理協議,簡稱SNMP)。 443埠:43埠即網頁瀏覽埠,主要是用於HTTPS服務,是提供加密和通過安全埠傳輸的另一種HTTP。 554埠:554埠默認情況下用於「Real Time Streaming Protocol」(實時流協議,簡稱RTSP)。 1024埠:1024埠一般不固定分配給某個服務,在英文中的解釋是「Reserved」(保留)。 1080埠:1080埠是Socks代理服務使用的埠,大家平時上網使用的WWW服務使用的是HTTP協議的代理服務。 1755埠:1755埠默認情況下用於「Microsoft Media Server」(微軟媒體伺服器,簡稱MMS)。 4000埠:4000埠是用於大家經常使用的QQ聊天工具的,再細說就是為QQ客戶端開放的埠,QQ服務端使用的埠是8000。 5554埠:在今年4月30日就報道出現了一種針對微軟lsass服務的新蠕蟲病毒——震盪波(Worm.Sasser),該病毒可以利用TCP 5554埠開啟一個FTP服務,主要被用於病毒的傳播。 5632埠:5632埠是被大家所熟悉的遠程式控制制軟體pcAnywhere所開啟的埠。 8080埠:8080埠同80埠,是被用於WWW代理服務的,可以實現網頁埠概念 在網路技術中,埠(Port)大致有兩種意思:一是物理意義上的埠,比如,ADSL Modem、集線器、交換機、路由器用於連接其他網路設備的介面,如RJ-45埠、SC埠等等。二是邏輯意義上的埠,一般是指TCP/IP協議中的埠,埠號的范圍從0到65535,比如用於瀏覽網頁服務的80埠,用於FTP服務的21埠等等。我們這里將要介紹的就是邏輯意義上的埠。 埠分類 邏輯意義上的埠有多種分類標准,下面將介紹兩種常見的分類: 1. 按埠號分布劃分 (1)知名埠(Well-Known Ports) 知名埠即眾所周知的埠號,范圍從0到1023,這些埠號一般固定分配給一些服務。比如21埠分配給FTP服務,25埠分配給SMTP(簡單郵件傳輸協議)服務,80埠分配給HTTP服務,135埠分配給RPC(遠程過程調用)服務等等。 (2)動態埠(Dynamic Ports) 動態埠的范圍從1024到65535,這些埠號一般不固定分配給某個服務,也就是說許多服務都可以使用這些埠。只要運行的程序向系統提出訪問網路的申請,那麼系統就可以從這些埠號中分配一個供該程序使用。比如1024埠就是分配給第一個向系統發出申請的程序。在關閉程序進程後,就會釋放所佔用的埠號。 不過,動態埠也常常被病毒木馬程序所利用,如冰河默認連接埠是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。 2. 按協議類型劃分 按協議類型劃分,可以分為TCP、UDP、IP和ICMP(Internet控制消息協議)等埠。下面主要介紹TCP和UDP埠: (1)TCP埠 TCP埠,即傳輸控制協議埠,需要在客戶端和伺服器之間建立連接,這樣可以提供可靠的數據傳輸。常見的包括FTP服務的21埠,Telnet服務的23埠,SMTP服務的25埠,以及HTTP服務的80埠等等。 (2)UDP埠 UDP埠,即用戶數據包協議埠,無需在客戶端和伺服器之間建立連接,安全性得不到保障。常見的有DNS服務的53埠,SNMP(簡單網路管理協議)服務的161埠,QQ使用的8000和4000埠等等。查看埠 在Windows 2000/XP/Server 2003中要查看埠,可以使用Netstat命令: 依次點擊「開始→運行」,鍵入「cmd」並回車,打開命令提示符窗口。在命令提示符狀態下鍵入「netstat -a -n」,按下回車鍵後就可以看到以數字形式顯示的TCP和UDP連接的埠號及狀態(如圖)。 小知識:Netstat命令用法 命令格式:Netstat �-a� �-e� �-n� �-o� �-s� -a 表示顯示所有活動的TCP連接以及計算機監聽的TCP和UDP埠。 -e 表示顯示乙太網發送和接收的位元組數、數據包數等。 -n 表示只以數字形式顯示所有活動的TCP連接的地址和埠號。 -o 表示顯示活動的TCP連接並包括每個連接的進程ID(PID)。 -s 表示按協議顯示各種連接的統計信息,包括埠號。 關閉/開啟埠 在介紹各種埠的作用前,這里先介紹一下在Windows中如何關閉/打開埠,因為默認的情況下,有很多不安全的或沒有什麼用的埠是開啟的,比如Telnet服務的23埠、FTP服務的21埠、SMTP服務的25埠、RPC服務的135埠等等。為了保證系統的安全性,我們可以通過下面的方法來關閉/開啟埠。 關閉埠 比如在Windows 2000/XP中關閉SMTP服務的25埠,可以這樣做:首先打開「控制面板」,雙擊「管理工具」,再雙擊「服務」。接著在打開的服務窗口中找到並雙擊「Simple Mail Transfer Protocol (SMTP)」服務,單擊「停止」按鈕來停止該服務,然後在「啟動類型」中選擇「已禁用」,最後單擊「確定」按鈕即可。這樣,關閉了SMTP服務就相當於關閉了對應的埠。 開啟埠 如果要開啟該埠只要先在「啟動類型」選擇「自動」,單擊「確定」按鈕,再打開該服務,在「服務狀態」中單擊「啟動」按鈕即可啟用該埠,最後,單擊「確定」按鈕即可。 提示:在Windows 98中沒有「服務」選項,你可以使用防火牆的規則設置功能來關閉/開啟埠。 79埠 埠說明:79埠是為Finger服務開放的,主要用於查詢遠程主機在線用戶、操作系統類型以及是否緩沖區溢出等用戶的詳細信息。比如要顯示遠程計算機www.abc.com上的user01用戶的信息,可以在命令行中鍵入「finger [email protected]」即可。 埠漏洞:一般黑客要攻擊對方的計算機,都是通過相應的埠掃描工具來獲得相關信息,比如使用「流光」就可以利用79埠來掃描遠程計算機操作系統版本,獲得用戶信息,還能探測已知的緩沖區溢出錯誤。這樣,就容易遭遇到黑客的攻擊。而且,79埠還被Firehotcker木馬作為默認的埠。 操作建議:建議關閉該埠。 80埠 埠說明:80埠是為HTTP(HyperText Transport Protocol,超文本傳輸協議)開放的,這是上網沖浪使用最多的協議,主要用於在WWW(World Wide Web,萬維網)服務上傳輸信息的協議。我們可以通過HTTP地址加「:80」(即常說的「網址」)來訪問網站的,比如http://www.cce.com.cn:80,因為瀏覽網頁服務默認的埠號是80,所以只要輸入網址,不用輸入「:80」。 埠漏洞:有些木馬程序可以利用80埠來攻擊計算機的,比如Executor、RingZero等。 操作建議:為了能正常上網沖浪,我們必須開啟80埠。 109與110埠 埠說明:109埠是為POP2(Post Office Protocol Version 2,郵局協議2)服務開放的,110埠是為POP3(郵件協議3)服務開放的,POP2、POP3都是主要用於接收郵件的,目前POP3使用的比較多,許多伺服器都同時支持POP2和POP3。客戶端可以使用POP3協議來訪問服務端的郵件服務,如今ISP的絕大多數郵件伺服器都是使用該協議。在使用電子郵件客戶端程序的時候,會要求輸入POP3伺服器地址,默認情況下使用的就是110埠(如圖)。 埠漏洞:POP2、POP3在提供郵件接收服務的同時,也出現了不少的漏洞。單單POP3服務在用戶名和密碼交換緩沖區溢出的漏洞就不少於20個,比如WebEasyMail POP3 Server合法用戶名信息泄露漏洞,通過該漏洞遠程攻擊者可以驗證用戶賬戶的存在。另外,110埠也被ProMail trojan等木馬程序所利用,通過110埠可以竊取POP賬號用戶名和密碼。 操作建議:如果是執行郵件伺服器,可以打開該埠。 135埠 埠說明:135埠主要用於使用RPC(Remote Procere Call,遠程過程調用)協議並提供DCOM(分布式組件對象模型)服務,通過RPC可以保證在一台計算機上運行的程序可以順利地執行遠程計算機上的代碼;使用DCOM可以通過網路直接進行通信,能夠跨包括HTTP協議在內的多種網路傳輸。 埠漏洞:相信去年很多Windows 2000和Windows XP用戶都中了「沖擊波」病毒,該病毒就是利用RPC漏洞來攻擊計算機的。RPC本身在處理通過TCP/IP的消息交換部分有一個漏洞,該漏洞是由於錯誤地處理格式不正確的消息造成的。該漏洞會影響到RPC與DCOM之間的一個介面,該介面偵聽的埠就是135。 操作建議:為了避免「沖擊波」病毒的攻擊,建議關閉該埠 137埠 埠說明:137埠主要用於「NetBIOS Name Service」(NetBIOS名稱服務),屬於UDP埠,使用者只需要向區域網或互聯網上的某台計算機的137埠發送一個請求,就可以獲取該計算機的名稱、注冊用戶名,以及是否安裝主域控制器、IIS是否正在運行等信息。 埠漏洞:因為是UDP埠,對於攻擊者來說,通過發送請求很容易就獲取目標計算機的相關信息,有些信息是直接可以被利用,並分析漏洞的,比如IIS服務。另外,通過捕獲正在利用137埠進行通信的信息包,還可能得到目標計算機的啟動和關閉的時間,這樣就可以利用專門的工具來攻擊。 操作建議:建議關閉該埠。 139埠 埠說明:139埠是為「NetBIOS Session Service」提供的,主要用於提供Windows文件和列印機共享以及Unix中的Samba服務。在Windows中要在區域網中進行文件的共享,必須使用該服務。比如在Windows 98中,可以打開「控制面板」,雙擊「網路」圖標,在「配置」選項卡中單擊「文件及列印共享」按鈕選中相應的設置就可以安裝啟用該服務;在Windows 2000/XP中,可以打開「控制面板」,雙擊「網路連接」圖標,打開本地連接屬性;接著,在屬性窗口的「常規」選項卡中選擇「Internet協議(TCP/IP)」,單擊「屬性」按鈕;然後在打開的窗口中,單擊「高級」按鈕;在「高級TCP/IP設置」窗口中選擇「WINS」選項卡,在「NetBIOS設置」區域中啟用TCP/IP上的NetBIOS。 埠漏洞:開啟139埠雖然可以提供共享服務,但是常常被攻擊者所利用進行攻擊,比如使用流光、SuperScan等埠掃描工具,可以掃描目標計算機的139埠,如果發現有漏洞,可以試圖獲取用戶名和密碼,這是非常危險的

緩沖區溢出的處理

你屋子裡的門和窗戶越少,入侵者進入的方式就越少……

由於緩沖區溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面「堆棧溢出攻擊」的原理可以看出,要防止此類攻擊,我們可以:

1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由於編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;

2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;

3、經常檢查你的操作系統和應用程序提供商的站點,一旦發現他們提供的補丁程序,就馬上下載並且應用在系統上,這是最好的方法。但是系統管理員總要比攻擊者慢一步,如果這個有問題的軟體是可選的,甚至是臨時的,把它從你的系統中刪除。舉另外一個例子,你屋子裡的門和窗戶越少,入侵者進入的方式就越少。

黑客主要先從微軟漏洞公布表上或者0days上找到漏洞,再根據漏洞編寫溢出程序(好多都自帶掃描功能)包括本地提權溢出,遠程提權溢出.編好後,先用那個掃描一下有漏洞的主機,然後再用它溢出獲得許可權,控制目標主機.

② 緩沖區溢出攻擊,的基本原理是什麼

緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。緩沖區溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩沖區溢出攻擊--Morris蠕蟲,發生在十年前,它曾造成了全世界6000多台網路伺服器癱瘓。
1.概念
緩沖區溢出是指當計算機向緩沖區內填充數據位數時超過了緩沖區本身的容量溢出的數據覆蓋在合法數據上,理想的情況是 程序檢查數據長度並不允許輸入超過緩沖區長度的字元,但是絕大多數程序都會假設數據長度總是與所分配的儲存空間想匹配,這就為緩沖區溢出埋下隱患.操作系統所使用的緩沖區 又被稱為"堆棧". 在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩沖區溢出 。
2.危害
在當前網路與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後為所欲為。
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. 通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
根據這兩個目標來對緩沖區溢出攻擊進行分類。在二.1節,將描述攻擊代碼是如何放入被攻擊程序的地址空間的。在二.2節,將介紹攻擊者如何使一個程序的緩沖區溢出,並且執行轉移到攻擊代碼(這個就是「溢出」的由來)。在二.3節,將綜合前兩節所討論的代碼安排和控製程序執行流程的技術。
二.1 在程序的地址空間里安排適當的代碼的方法
有兩種在被攻擊程序地址空間里安排攻擊代碼的方法:
1、植入法:
攻擊者向被攻擊的程序輸入一個字元串,程序會把這個字元串放到緩沖區里。這個字元串包含的資料是可以在這個被攻擊的硬體平台上運行的指令序列。在這里,攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。緩沖區可以設在任何地方:堆棧(stack,自動變數)、堆(heap,動態分配的內存區)和靜態資料區。
2、利用已經存在的代碼:
有時,攻擊者想要的代碼已經在被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數。比如,攻擊代碼要求執行「exec (「/bin/sh」)」,而在libc庫中的代碼執行「exec (arg)」,其中arg使一個指向一個字元串的指針參數,那麼攻擊者只要把傳入的參數指針改向指向」/bin/sh」。
二.2 控製程序轉移到攻擊代碼的方法
所有的這些方法都是在尋求改變程序的執行流程,使之跳轉到攻擊代碼。最基本的就是溢出一個沒有邊界檢查或者其它弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出一個緩沖區,攻擊者可以用暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。
分類的基準是攻擊者所尋求的緩沖區溢出的程序空間類型。原則上是可以任意的空間。實際上,許多的緩沖區溢出是用暴力的方法來尋求改變程序指針的。這類程序的不同之處就是程序空間的突破和內存空間的定位不同。主要有以下三種: 1、活動紀錄(Activation Records):
每當一個函數調用發生時,調用者會在堆棧中留下一個活動紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出堆棧中的自動變數,使返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為堆棧溢出攻擊(Stack Smashing Attack),是目前最常用的緩沖區溢出攻擊方式。
2、函數指針(Function Pointers):
函數指針可以用來定位任何地址空間。例如:「void (* foo)()」聲明了一個返回值為void的函數指針變數foo。所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了。它的一個攻擊範例就是在linux系統下的superprobe程序。
3、長跳轉緩沖區(Longjmp buffers):
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定「setjmp(buffer)」,用「longjmp(buffer)」來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麼「longjmp(buffer)」實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。一個典型的例子就是Perl 5.003的緩沖區溢出漏洞;攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了。
二.3代碼植入和流程式控制制技術的綜合分析
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼植入和活動紀錄技術。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出,改變活動紀錄的同時植入了代碼。這個是由Levy指出的攻擊的模板。因為C在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例十分常見。
代碼植入和緩沖區溢出不一定要在在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出的緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大(不能放下全部的代碼)的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部植入代碼,他們通常必須把代碼作為參數調用。舉例來說,在libc(幾乎所有的C程序都要它來連接)中的部分代碼段會執行「exec(something)」,其中somthing就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,然後利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。
三、 緩沖區溢出攻擊的實驗分析
2000年1月,Cerberus 安全小組發布了微軟的IIS 4/5存在的一個緩沖區溢出漏洞。攻擊該漏洞,可以使Web伺服器崩潰,甚至獲取超級許可權執行任意的代碼。目前,微軟的IIS 4/5 是一種主流的Web伺服器程序;因而,該緩沖區溢出漏洞對於網站的安全構成了極大的威脅;它的描述如下:
瀏覽器向IIS提出一個HTTP請求,在域名(或IP地址)後,加上一個文件名,該文件名以「.htr」做後綴。於是IIS認為客戶端正在請求一個「.htr」文件,「.htr」擴展文件被映像成ISAPI(Internet Service API)應用程序,IIS會復位向所有針對「.htr」資源的請求到 ISM.DLL程序 ,ISM.DLL 打開這個文件並執行之。
瀏覽器提交的請求中包含的文件名存儲在局部變數緩沖區中,若它很長,超過600個字元時,會導致局部變數緩沖區溢出,覆蓋返回地址空間,使IIS崩潰。更進一步,在如圖1所示的2K緩沖區中植入一段精心設計的代碼,可以使之以系統超級許可權運行。
四、緩沖區溢出攻擊的防範方法
緩沖區溢出攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權。如果能有效地消除緩沖區溢出的漏洞,則很大一部分的安全威脅可以得到緩解。
目前有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。在四.1中介紹了通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。在四.2中介紹了強制寫正確的代碼的方法。在四.3中介紹了利用編譯器的邊界檢查來實現緩沖區的保護。這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。在四.4中介紹一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩沖區溢出失效,但它能阻止絕大多數的緩沖區溢出攻擊。然後在四.5,分析這種保護方法的兼容性和性能優勢。

四.1 非執行的緩沖區
通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。在早期的Unix系統設計中,只允許程序代碼在代碼段中執行。但是近來的Unix和MS Windows系統由於要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,這也是緩沖區溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。
但是可以設定堆棧數據段不可執行,這樣就可以保證程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:
(1)信號傳遞:
Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼來實現向進程發送Unix信號。非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的。
(2)GCC的在線重用:
研究發現gcc在堆棧區里放置了可執行的代碼作為在線重用之用。然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。
非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其它形式的攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其它的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。
四.2 編寫正確的代碼
編寫正確的代碼是一件非常有意義的工作,特別象編寫C語言那種風格自由而容易出錯的程序,這種風格是由於追求性能而忽視正確性的傳統引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。
最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,比如對strcpy和sprintf的調用,這兩個函數都沒有檢查輸入參數的長度。事實上,各個版本C的標准庫均有這樣的問題存在。
此外,人們還開發了一些高級的查錯工具,如fault injection等。這些工具的目的在於通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞。還有一些靜態分析工具用於偵測緩沖區溢出的存在。
雖然這些工具幫助程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在。

③ 怎麼解決緩沖區溢出的問題啊``各位大俠請指點!謝了!!

緩沖區溢出是指當計算機程序向緩沖區內填充的數據位數超過了緩沖區本身的容量。溢出的數據覆蓋在合法數據上。理想情況是,程序檢查數據長度並且不允許輸入超過緩沖區長度的字元串。但是絕大多數程序都會假設數據長度總是與所分配的存儲空間相匹配,這就為緩沖區溢出埋下隱患。操作系統所使用的緩沖區又被稱為堆棧,在各個操作進程之間,指令被臨時存儲在堆棧當中,堆棧也會出現緩沖區溢出。

當一個超長的數據進入到緩沖區時,超出部分就會被寫入其他緩沖區,其他緩沖區存放的可能是數據、下一條指令的指針,或者是其他程序的輸出內容,這些內容都被覆蓋或者破壞掉。可見一小部分數據或者一套指令的溢出就可能導致一個程序或者操作系統崩潰。

緩沖區溢出是由編程錯誤引起的。如果緩沖區被寫滿,而程序沒有去檢查緩沖區邊界,也沒有停止接收數據,這時緩沖區溢出就會發生。緩沖區邊界檢查被認為是不會有收益的管理支出,計算機資源不夠或者內存不足是編程者不編寫緩沖區邊界檢查語句的理由,然而摩爾定律已經使這一理由失去了存在的基礎,但是多數用戶仍然在主要應用中運行十年甚至二十年前的程序代碼。

緩沖區溢出之所以泛濫,是由於開放源代碼程序的本質決定的。一些編程語言對於緩沖區溢出是具有免疫力的,例如Perl能夠自動調節位元組排列的大小,Ada95能夠檢查和阻止緩沖區溢出。但是被廣泛使用的C語言卻沒有建立檢測機制。標准C語言具有許多復制和添加字元串的函數,這使得標准C語言很難進行邊界檢查。C++略微好一些,但是仍然存在緩沖區溢出。一般情況下,覆蓋其他數據區的數據是沒有意義的,最多造成應用程序錯誤,但是,如果輸入的數據是經過「黑客」或者病毒精心設計的,覆蓋緩沖區的數據恰恰是「黑客」或者病毒的入侵程序代碼,一旦多餘位元組被編譯執行,「黑客」或者病毒就有可能為所欲為,獲取系統的控制權。

使用一組或多組附加驅動器存儲數據的副本,這就叫數據冗餘技術。比如鏡像就是一種數據冗餘技術。

④ 緩沖區溢出攻擊的6.防範方法

有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。

1、通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。

2、強制寫正確的代碼的方法。

3、利用編譯器的邊界檢查來實現緩沖區的保護。這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。

4、一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩沖區溢出失效,但它能阻止絕大多數的緩沖區溢出攻擊。分析這種保護方法的兼容性和性能優勢。

非執行的緩沖區

通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。在早期的Unix系統設計中,只允許程序代碼在代碼段中執行。

但是Unix和MS Windows系統由於要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,這也是緩沖區溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。

但是可以設定堆棧數據段不可執行,這樣就可以保證程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:

⑴信號傳遞

Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼來實現向進程發送Unix信號。非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的。

⑵GCC的在線重用

研究發現gcc在堆棧區里放置了可執行的代碼作為在線重用之用。然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。

非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其它形式的攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其它的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。

(4)緩沖區漏洞安全編譯選項擴展閱讀:

原理

通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。

例如下面程序:

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的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。

緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。

⑤ 對於緩沖區溢出的漏洞最佳的解決方法有哪些

緩沖區溢出是利用系統或者程序中的漏洞(對於邊界未有效檢查),從而使得程序的返回地址遭到意外覆蓋導致的,所以及時更新安全漏洞是有效的解決辦法。

⑥ 漏洞分析的內容導讀

本書分為5篇,共33章。
第1篇 漏洞利用原理(初級)
第1章 基礎知識
本章著重對漏洞挖掘中的一些基礎知識進行介紹。首先是漏洞研究中的一些基本概念和原理;然後是對Windows平台下可執行文件的結構和內存方面的一些基礎知識的介紹;最後介紹了一些漏洞分析中經常使用的軟體工具。包括調試工具、反匯編工具、二進制編輯工具等。您會在後面的調試實驗中反復見到這些工具的身影。在這章的最後一節,我們設計了一個非常簡單的破解小實驗,用於實踐工具的應用,消除您對二進制的恐懼感,希望能夠給您帶來一些樂趣。
第2章 棧溢出原理與實踐
基於棧的溢出是最基礎的漏洞利用方法。本章首先用大量的示意圖,深入淺出地講述了操作系統中函數調用、系統棧操作等概念和原理;隨後通過三個調試實驗逐步講解如何通過棧溢出,一步一步地劫持進程並植入可執行的機器代碼。即使您沒有任何匯編語言基礎,從未進行過二進制級別的調試,在本章詳細的實驗指導下也能輕松完成實驗,體會到exploit的樂趣。
第3章 開發shellcode的藝術
本章緊接第2章的討論,比較系統地介紹了溢出發生後,如何布置緩沖區、如何定位shellcode、如何編寫和調試shellcode等實際的問題。最後兩小節還給出了一些編寫shellcode的高級技術,供有一定匯編基礎的朋友做參考。
第4章 用MetaSploit開發Exploit
MetaSploit是軟體工程中的Frame Work(架構)在安全技術中的完美實現,它把模塊化、繼承性、封裝等面向對象的特點在漏洞利用程序的開發中發揮得淋漓盡致。使用這個架構開發Exploit要比直接使用C語言寫出的Exploit簡單得多。本章將集中介紹如何使用這個架構進行Exploit開發。
第5章 堆溢出利用
在很長一段時間內,Windows下的堆溢出被認為是不可利用的,然而事實並非如此。本章將用精闢的論述點破堆溢出利用的原理,讓您輕松領會堆溢出的精髓。此外,這章的一系列調試實驗將加深您對概念和原理的理解。用通俗易懂的方式論述復雜的技術是本書始終堅持的原則。
第6章 形形色色的內存攻擊技術
在了解基本的堆棧溢出後,本章將為大家展示更為高級的內存攻擊技術。本章集中介紹了一些曾發表於Black Hat上的著名論文中所提出的高級利用技術,如狙擊Windows異常處理機制、攻擊虛函數、off by one、 Heap Spray等利用技巧。對於安全專家,了解這些技巧和手法不至於在分析漏洞時錯把可以利用的漏洞誤判為低風險類型;對於黑客技術愛好者,這些知識很可能成為激發技術靈感的火花。
第7章 手機里的緩沖區溢出
在PC機上的溢出攻擊進行的如火如荼的時候,您是否也想了解手機平台上的緩沖區溢出問題?那就不要錯過本章!本章以ARM和Windows Mobile為例,介紹手機平台上編程和調試技巧。並在最後以一個手機上的exploit me為大家揭開手機里緩沖區溢出的神秘面紗。
第8章 其他類型的軟體漏洞
緩沖區溢出漏洞只是軟體漏洞的一個方面,我們來看看其他一些流行的安全漏洞。如格式化串漏洞、SQL注入、XPath注入、XSS等安全漏洞產生的原因、利用技巧及防範措施。
第2篇 漏洞利用原理(高級)
第9章 Windows安全機制概述
微軟在Windows XP SP2和Windows 2003之後,向操作系統中加入了許多安全機制。本章將集中討論這些安全機制對漏洞利用的影響。
第10章 棧中的守護天使:GS
針對緩沖區溢出時覆蓋函數返回地址這一特徵,微軟在編譯程序時使用了一個很酷的安全編譯選項——GS。本章將對GS編譯選項的原理進行詳細介紹,並介紹幾種繞過GS的溢出技巧。
第11章 亡羊補牢:SafeSEH
攻擊S.E.H已經成為windows平台下漏洞利用的經典手法。為了遏制日益瘋狂的攻擊,微軟在Windows XP SP2及後續版本的操作系統中引入了著名的S.E.H校驗機制SafeSEH。本章將會對這一安全機制進行詳細的分析,並介紹其中的不足和繞過方法。
第12章 數據與程序的分水嶺:DEP
溢出攻擊的根源在於現代計算機對數據和代碼沒有明確區分這一先天缺陷, 而DEP這種看似釜底抽薪式的防護措施是否真的可以杜絕溢出攻擊呢?答案馬上揭曉。
第13章 在內存中躲貓貓:ASLR
程序載入時不再使用固定的基址載入,ASLR技術將溢出時使用的跳板在內存中隱藏了起來,沒有了跳板我們如何溢出呢?本章將帶領您在黑暗中尋找溢出的出口。
第14章 S.E.H終極防護:SEHOP
SafeSEH的敗北,讓微軟推出一種更為嚴厲的S.E.H保護機制SEHOP。這里將為您展示這種保護機制的犀利之處。
第15章 重重保護下的堆
當堆溢出變成可能後,微軟不能再無視堆中的保護機制了,讓我們一覽堆中的保護機制,並分析其漏洞。
第3篇 漏洞挖掘技術
第16章 漏洞挖掘技術簡介
不論從工程上講還是從學術上講,漏洞挖掘都是一個相當前沿的領域。本章將從動態測試和靜態審計兩方面對漏洞挖掘技術的基礎知識進行簡單的介紹。
第17章 文件類型漏洞挖掘與Smart Fuzz
文件類型的漏洞層出不窮,持續威脅著互聯網的安全。如何系統的測試文件格式,產生精確有效的畸形測試用例用以發掘文件解析器的安全漏洞,並不是一件容易的事情。本章將從理論和實踐兩個方面向您講述灰盒測試技術。
第18章 FTP的漏洞挖掘
本章將簡述FTP協議,並手把手地帶領您完成幾個初級的漏洞測試案例,讓您親身體會下真實的漏洞長什麼模樣。
第19章 E-mail的漏洞挖掘
E-mail系統涉及的安全問題不光只有緩沖區溢出,在本章的挖掘案例中,您會發現除了工具和常用方法外,威力最為強大的武器還是您的大腦。Evil thinking是安全測試中最重要的思維方式之一。
第20章 ActiveX控制項的漏洞挖掘
控制項類漏洞曾經是大量網馬的棲身之地。本章將結合若干個曾經的0 day向您比較系統的介紹這類漏洞的測試、調試的相關工具和方法。
第4篇 操作系統內核安全
第21章 探索ring0
研究內核漏洞,需要首先掌握一些內核基礎知識,例如內核驅動程序的開發、編譯、運行和調試,內核中重要的數據結構等,本章將為讀者開啟探索ring0之門,逐步掌握一些內核基礎知識。
第22章 內核漏洞利用技術
本章將帶領讀者從一個簡單的內核漏洞程序exploitme.sys的編寫開始,展示內核漏洞利用的思路、方法,以及利用程序和Ring0 Shellcode的編寫和設計。
第23章 FUZZ驅動程序
掌握了內核漏洞的原理和利用方法,本章將進入內核漏洞挖掘階段,學習較為高級的內核漏洞挖掘技術,最後實踐該漏洞挖掘技術,分析挖掘出內核漏洞。
第24章 內核漏洞案例分析
本章對幾種典型的內核漏洞,用幾個真實的內核漏洞案例來詳細分析,分析漏洞造成的具體原因和細節,並構造漏洞成功利用的方法。
第5篇 漏洞分析案例
第25章 漏洞分析技術概述
本章縱覽了漏洞分析與調試的思路,並介紹了一些輔助漏洞調試分析的高級逆向工具。
第26章 RPC入侵:MS06-040 與MS08-067
由於可以做到主動式遠程入侵,RPC級別的漏洞被譽為漏洞中的王者,此類漏洞也極其稀有,每一個都有一段曲折的故事。值得一提的是最近的兩個RPC系統漏洞竟然出自同一個函數。本章將對這個縫來補去沒有修好的函數進行詳細分析,讓您從攻防兩方面深刻理解漏洞的起因和修復策略的重要性。
第27章 MS06-055分析:實戰Heap Spray
通過網頁「掛馬」是近年來攻擊者慣用的手法。本章通過分析微軟IE瀏覽器中真實的緩沖區溢出漏洞,告訴您為什麼不能隨便點擊來歷不明的URL鏈接,並在實戰中為大家演示Heap Spray技術。
第28章 MS09-032分析:一個「&」引發的血案
一個視頻網頁的背後可能是一隻兇狠的木馬,這就是著名的Microsoft DirectShow MPEG-2視頻ActiveX控制項遠程代碼執行漏洞。本章將為您分析該漏洞產生的原因及分析技巧。
第29章 Yahoo!Messenger棧溢出漏洞
在波濤洶涌的溢出大潮中Yahoo也沒能倖免,作為國外非常流行的Yahoo!Messenger也存在過非常嚴重的漏洞。本章將重現當時的場景,並分析漏洞產生的原因。
第30章 CVE-2009-0927:PDF中的JS
您可能不會隨便運行一個可執行文件,但是您會想到別人發過來的PDF文檔中也有可能隱藏著一些東西嗎?本章將以PDF文檔為例,帶您領略文件類型溢出漏洞的風采。
第31章 壩之蟻穴:超長URL溢出漏洞
安全軟體不一定安全,即便是這款保護未成年人健康上網的計算機終端過濾軟體,也有可能成為黑客攻擊的窗口。本章將介紹綠壩軟體中一個已經被修復了的安全漏洞。
第32章 暴風影音M3U文件解析漏洞
晚上回家後用暴風影音打開別人發過來的M3U列表文件,在你陶醉於其內容之時,一隻精乾的小馬已悄然在後台運行。想要了解這只小馬是如何進入你的電腦的?請閱讀本章。
第33章 LNK快捷方式文件漏洞
是否我不去運行任何可疑文件,不去打開陌生的網址就安全了呢?答案是否定。LNK快捷方式漏洞無需打開文件,只要瀏覽惡意文件,所在文件夾就會中毒,俗稱「看一眼就掛」。本章將帶您分析這一神奇的漏洞。
Failwest

⑦ 網路安全-----緩沖區溢出的保護方法有哪些

目前有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。

編寫正確的代碼 非執行的緩沖區 數組邊界檢查 程序指針完整性檢查

一、編寫正確的代碼 Top

編寫正確的代碼是一件非常有意義但耗時的工作,特別像編寫C語言那種具有容易出錯傾向的程序(如:字元串的零結尾),這種風格是由於追求性能而忽視正確性的傳統引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序組具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。

最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,比如對strcpy和sprintf的調用,這兩個函數都沒有檢查輸入參數的長度。事實上,各個版本C的標准庫均有這樣的問題存在。為了尋找一些常見的諸如緩沖區溢出和操作系統競爭條件等漏洞,一些代碼檢查小組檢查了很多的代碼。然而依然有漏網之魚存在。盡管採用了strcpy和sprintf這些替代函數來防止緩沖區溢出的發生,但是由於編寫代碼的問題,仍舊會有這種情況發生。比如lprm程序就是最好的例子,雖然它通過了代碼的安全檢查,但仍然有緩沖區溢出的問題存在。

為了對付這些問題,人們開發了一些高級的查錯工具,如faultinjection等。這些工具的目的在於通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞。還有一些靜態分析工具用於偵測緩沖區溢出的存在。雖然這些工具可以幫助程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在,除非程序員能保證他的程序萬元一失。

二、非執行的緩沖區 Top

通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。事實上,很多老的Unix系統都是這樣設計的,但是近來的Unix和MS Windows系統為實現更好的性能和功能,往往在數據段中動態地放人可執行的代碼。所以為了保持程序的兼容性不可能使得所有程序的數據段不可執行。但是我們可以設定堆棧數據段不可執行,這樣就可以最大限度地保證了程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合的
程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:

1.信號傳遞

Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼進而實現向進程發送Unix信號.非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的.

2.GCC的在線重用

研究發現gcc在堆棧區里放置了可執行的代碼以便在線重用。然而,關閉這個功能並不產生任何問題.只有部分功能似乎不能使用。非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其他形式的攻擊則沒有效果。通過引用一個駐留
的程序的指針,就可以跳過這種保護措施。其他的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。

三、數組邊界檢查 Top

植入代碼引起緩沖區溢出是一個方面,擾亂程序的執行流程是另一個方面。不像非執行緩沖區保護,數組邊界檢查完全沒有了緩沖區溢出的產生和攻擊。這樣,只要數組不能被溢出,溢出攻擊也就無從談起。為了實現數組邊界檢查,則所有的對數組的讀寫操作都應當被檢查以確保對數組的操作在正確的范圍內。最直接的方法是檢查所有的數組操作,但是通常可以來用一些優化的技術來減少檢查的次數。目前有以下的幾種檢查方法:

1、Compaq C編譯器

Compaq公司為Alpha CPU開發的C編譯器支持有限度的邊界檢查(使用—check_bounds參數)。這些限制是:只有顯示的數組引用才被檢查,比如「a[3]」會被檢查,而「*(a
+3)"則不會。由於所有的C數組在傳送的時候是指針傳遞的,所以傳遞給函數的的數組不會被檢查。帶有危險性的庫函數如strcpy不會在編譯的時候進行邊界檢查,即便是指定了邊界檢查。在C語言中利用指針進行數組操作和傳遞是非常頻繁的,因此這種局限性是非常嚴重的。通常這種邊界檢查用來程序的查錯,而且不能保證不發生緩沖區溢出的漏洞。

2、Jones&Kelly:C的數組邊界檢查

Richard Jones和Paul Kelly開發了一個gcc的補丁,用來實現對C程序完全的數組邊界檢查。由於沒有改變指針的含義,所以被編譯的程序和其他的gcc模塊具有很好的兼容性。更進一步的是,他們由此從沒有指針的表達式中導出了一個「基」指針,然後通過檢查這個基指針來偵測表達式的結果是否在容許的范圍之內。當然,這樣付出的性能上的代價是巨大的:對於一個頻繁使用指針的程序,如向量乘法,將由於指針的頻繁使用而使速度慢30倍。這個編譯器目前還很不成熟,一些復雜的程序(如elm)還不能在這個上面編譯、執行通過。然而在它的一個更新版本之下,它至少能編譯執行ssh軟體的加密軟體包,但其實現的性能要下降12倍。

3、Purify:存儲器存取檢查

Purify是C程序調試時查看存儲器使用的工具而不是專用的安全工具。Purify使用"目標代碼插入"技術來檢查所有的存儲器存取。通過用Purify連接工具連接,可執行代碼在執行的時候帶來的性能的損失要下降3—5倍。

4、類型——安全語言

所有的緩沖區溢出漏洞都源於C語言的類型安全。如果只有類型—安全的操作才可以被允許執行,這樣就不可能出現對變數的強制操作。如果作為新手,可以推薦使用具有類型—安全的語言如JAVA和ML。

但是作為Java執行平台的Java虛擬機是C程序.因此攻擊JVM的一條途徑是使JVM的緩沖區溢出。因此在系統中採用緩沖區溢出防衛技術來使用強制類型—安全的語言可以收到預想不到的效果。

四、程序指針完整性檢查 Top

程序指針完整性檢查和邊界檢查有略微的不同。與防止程序指針被改變不同,程序指針完整性檢查在程序指針被引用之前檢測到它的改變。因此,即便一個攻擊者成功地改變程序的指針,由於系統事先檢測到了指針的改變,因此這個指針將不會被使用。與數組邊界檢查相比,這種方法不能解決所有的緩沖區溢出問題;採用其他的緩沖區溢出方法就可以避免這種檢測。但是這種方法在性能上有很大的優勢,而且兼容性也很好。

l、手寫的堆棧監測

Snarskii為FreeBSD開發丁一套定製的能通過監測cpu堆棧來確定緩沖區溢出的libc。這個應用完全用手工匯編寫的,而且只保護libc中的當前有效紀錄函數.這個應用達到了設計要求,對於基於libc庫函數的攻擊具有很好的防衛,但是不能防衛其它方式的攻擊.

2、堆棧保護

堆棧保護是一種提供程序指針完整性檢查的編譯器技術.通過檢查函數活動紀錄中的返回地址來實現。堆棧保護作為gcc的一個小的補丁,在每個函數中,加入了函數建立和銷毀的代碼。加入的函數建立代碼實際上在堆棧中函數返回地址後面加了一些附加的位元組。而在函數返回時,首先檢查這個附加的位元組是否被改動過,如果發生過緩沖區溢出的攻擊,那麼這種攻擊很容易在函數返回前被檢測到。但是,如果攻擊者預見到這些附加位元組的存在,並且能在溢出過程中同樣地製造他們.那麼它就能成功地跳過堆棧保護的檢測。通常.我們有如下兩種方案對付這種欺騙:

1.終止符號

利用在C語言中的終止符號如o(null,CR,LF,—1(Eof)等這些符號不能在常用的字元串函數中使用,因為這些函數一旦遇到這些終止符號,就結束函數過程了。

2.隨機符號

利用一個在函數調用時產生的一個32位的隨機數來實現保密,使得攻擊者不可能猜測到附加位元組的內容.而且,每次調用附加位元組的內容都在改變,也無法預測。通過檢查堆棧的完整性的堆棧保護法是從Synthetix方法演變來的。Synthetix方法通過使用准不變數來確保特定變數的正確性。這些特定的變數的改變是程序實現能預知的,而且只能在滿足一定的條件才能可以改變。這種變數我們稱為准不變數。Synthetix開發了一些工具用來保護這些變數。攻擊者通過緩沖區溢出而產生的改變可以被系統當做非法的動作。在某些極端的情況下,這些准不變數有可能被非法改變,這時需要堆棧保護來提供更完善的保護了。實驗的數據表明,堆棧保護對於各種系統的緩沖區溢出攻擊都有很好的保護作用.並能保持較好的兼容性和系統性能。分析表明,堆棧保護能有效抵禦現在的和將來的基於堆棧的攻擊。堆棧保護版本的Red Hat Linux 5.1已經在各種系統上運行了多年,包括個人的筆記本電腦和工作組文件伺服器。

3、指針保護

在堆棧保護設計的時候,沖擊堆棧構成了緩沖區溢出攻擊的常見的一種形式。有人推測存在一種模板來構成這些攻擊(在1996年的時候)。從此,很多簡單的漏洞被發現,實施和補丁後,很多攻擊者開始用更一般的方法實施緩沖區溢出攻擊。指針保護是堆錢保護針對這種情況的一個推廣。通過在所有的代碼指針之後放置附加位元組來檢驗指針在被調用之前的合法性,如果檢驗失敗,會發出報警信號和退出程序的執行,就如同在堆棧保護中的行為一樣。這種方案有兩點需要注意:

(1)附加位元組的定位
附加位元組的空間是在被保護的變數被分配的時候分配的,同時在被保護位元組初始化過程中被初始化。這樣就帶來了問題:為了保持兼容性,我們不想改變被保護變數的大小,因此我們不能簡單地在變數的結構定義中加入附加字。還有,對各種類型也有不同附加位元組數目。

(2)查附加位元組
每次程序指針被引用的時候都要檢查附加位元組的完整性。這個也存在問題因為「從存取器讀」在編譯器中沒有語義,編譯器更關心指針的使用,而各種優化演算法傾向於從存儲器中讀人變數.還有隨著變數類型的不同,讀入的方法也各自不同。到目前為止,只有很少—部分使用非指針變數的攻擊能逃脫指針保護的檢測。但是,可以通過在編譯器上強制對某一變數加入附加位元組來實現檢測,這時需要程序員自己手工加入相應的保護了。

⑧ 如何防範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中的所有文件解壓出來。

⑨ 如何應對緩沖區溢出漏洞攻擊

1999年,至少有半數的建議與緩沖區溢出有關,目前公開的安全漏洞通告也有相當一部分屬於 緩沖區溢出漏洞。 緩沖區溢出攻擊利用了目標程序的緩沖區溢出漏洞,通過操作目標程序堆棧並暴力改寫其返回地址,從而獲得目標控制權。它的原理是:向一個有限空間的緩沖區中拷貝過長的字元串,這帶來兩種後果,一是過長的字元串覆蓋了相臨的存儲單元而造成程序癱瘓,甚至造成宕機、系統或進程重啟等;二是可讓攻擊者運行惡意代碼,執行任意指令,甚至獲得超級許可權等。 事實上,在網路空間中利用這種緩沖區溢出漏洞而發起的攻擊屢見不鮮。早在1988年,美國康奈爾大學的計算機科學系研究生,23歲的莫里斯利用Unix fingered程序不限制輸入長度的漏洞,輸入512個字元後使緩沖器溢出。莫里斯又寫了一段特別大的程序使他的惡意程序能以root(根)身份執行,並感染到其他機器上。年初名燥一時的「SQL Slammer」蠕蟲王的發作原理,就是利用未及時更新補丁的MS SQL Server資料庫緩沖區溢出漏洞,採用不正確的方式將數據發到MS SQL Server的監聽埠,這個錯誤可以引起緩沖溢出攻擊。攻擊代碼通過緩沖溢出獲得非法許可權後,被攻擊主機上的Sqlserver.exe進程會嘗試向隨機的IP地址不斷發送攻擊代碼,感染其他機器,最終形成UDP Flood,造成網路堵塞甚至癱瘓。 由上可知,緩沖區溢出攻擊通常是在一個字元串里綜合了代碼植入和激活紀錄。如攻擊者將目標定為具有溢出漏洞的自動變數,然後向程序傳遞超長的字元串,進而引發緩沖區溢出。經過精巧設計的攻擊代碼以一定的許可權運行漏洞程序,獲得目標主機的控制權。這種攻擊手段屢次得逞主要是利用了程序中邊境條件、函數指針等設計不當問題,即利用了C程序本身的不安全性。大多數Windows、Linux、Unix系列的開發都依賴於C語言,所以緩沖區溢出攻擊成為操作系統、資料庫等應用程序最普遍的漏洞之一。 值得關注的是,防火牆對這種攻擊方式無能為力,因為攻擊者傳輸的數據分組並無異常特徵,沒有任何欺騙(這就是Nimda、SQL Slammer可以順利穿透防火牆的原因)。另外可以用來實施緩沖區溢出攻擊的字元串非常多樣化,無法與正常數據有效進行區分。緩沖區溢出攻擊不是一種竊密和欺騙的手段,而是從計算機系統的最底層發起攻擊,因此在它的攻擊下系統的身份驗證和訪問許可權等安全策略形同虛設。 用戶及開發者該如何降低因緩沖區溢出而造成的攻擊損失呢?首先,編程人員可以使用具有類型安全的語言 Java以避免C的缺陷;產品發布前仔細檢查程序溢出情況;使用檢查堆棧溢出的編譯器等。作為普通用戶或系統管理員,應及時為自己的操作系統和應用程序更新補丁;減少不必要的開放服務埠等,合理配置您的系統。

⑩ 根據源代碼,找出存在的緩沖區溢出漏洞。

char Password[8];
gets(Password[8]);

可以設計shellcode字串作為gets輸入,可以淹沒Password後面的棧里的return地址,然後函數返回時會執行shellcode。

如果你的程序編譯時帶了GS選項,那這種溢出在XP SP2後的系統是很難被利用的,系統會壓入security cookie來保護棧溢出.

閱讀全文

與緩沖區漏洞安全編譯選項相關的資料

熱點內容
程序員用得到數字區嗎 瀏覽:170
python求商 瀏覽:473
ipad能用c語言編譯器嗎 瀏覽:557
軟泥解壓球最新版 瀏覽:994
4萬程序員辭職創業 瀏覽:755
thinkingphp 瀏覽:593
安卓相冊移動文件夾 瀏覽:2
耳朵清潔解壓聲控99的人都睡得著 瀏覽:201
叉車出租網站源碼 瀏覽:870
共享單車的app是什麼 瀏覽:404
不帶gui的伺服器什麼意思 瀏覽:369
金剛經及PDF 瀏覽:98
php中冒號 瀏覽:354
php5432 瀏覽:348
命令在哪使用 瀏覽:168
php獲取網頁元素 瀏覽:704
為什麼需要硬體驅動編譯 瀏覽:881
pm編程怎樣看導柱孔對不對稱 瀏覽:134
農業大學選課找不到伺服器怎麼辦 瀏覽:645
路由配置網關命令 瀏覽:931