亚洲一区人妻,久久三级免费,国模少妇无码一区二区三区,日韩av动漫

國內(nèi)或國外 期刊或論文

您當(dāng)前的位置:發(fā)表學(xué)術(shù)論文網(wǎng)電子論文》 計(jì)算機(jī)應(yīng)用論文之緩沖區(qū)溢出以及漏洞的探討> 正文

計(jì)算機(jī)應(yīng)用論文之緩沖區(qū)溢出以及漏洞的探討

所屬分類:電子論文 閱讀次 時(shí)間:2014-10-22 14:11

本文摘要:摘要 論文詳細(xì)分析了緩沖區(qū)溢出的原理,描述了網(wǎng)絡(luò)攻擊者利用緩沖區(qū)溢出漏洞進(jìn)行系統(tǒng)攻擊的一般過程,最后簡單討論了幾種緩沖區(qū)溢出的保護(hù)方法。 關(guān)鍵詞 緩沖區(qū)溢出 緩沖區(qū)溢出漏洞 安全攻擊 緩沖區(qū)溢出保護(hù) 在過去的十年中,以緩沖區(qū)溢出為攻擊類型的安全漏

  摘要 論文詳細(xì)分析了緩沖區(qū)溢出的原理,描述了網(wǎng)絡(luò)攻擊者利用緩沖區(qū)溢出漏洞進(jìn)行系統(tǒng)攻擊的一般過程,最后簡單討論了幾種緩沖區(qū)溢出的保護(hù)方法。

  關(guān)鍵詞 緩沖區(qū)溢出 緩沖區(qū)溢出漏洞 安全攻擊 緩沖區(qū)溢出保護(hù)

  在過去的十年中,以緩沖區(qū)溢出為攻擊類型的安全漏洞是最為常見的一種形式。更為嚴(yán)重的是,緩沖區(qū)溢出漏洞占了遠(yuǎn)程網(wǎng)絡(luò)攻擊的絕大多數(shù),這種攻擊可以使得一個(gè)匿名的Internet用戶有機(jī)會(huì)獲得一臺(tái)主機(jī)的部分或全部的控制權(quán)!由于這類攻擊使任何人都有可能取得主機(jī)的控制權(quán),所以它代表了一類極其嚴(yán)重的安全威脅。

  緩沖區(qū)溢出攻擊之所以成為一種常見的攻擊手段,其原因在于緩沖區(qū)溢出漏洞太普通了,并且易于實(shí)現(xiàn)。而且,緩沖區(qū)溢出所以成為遠(yuǎn)程攻擊的主要手段,其原因在于緩沖區(qū)溢出漏洞給予了攻擊者所想要的一切:殖入并且執(zhí)行攻擊代碼。被殖入的攻擊代碼以一定的權(quán)限運(yùn)行有緩沖區(qū)溢出漏洞的程序,從而得到被攻擊主機(jī)的控制權(quán)。本文簡單介紹了緩沖區(qū)溢出的基本原理和預(yù)防辦法。

  一、緩沖區(qū)溢出的概念和原理

  緩沖區(qū)是內(nèi)存中存放數(shù)據(jù)的地方。在程序試圖將數(shù)據(jù)放到機(jī)器內(nèi)存中的某一個(gè)位置的時(shí)候,因?yàn)闆]有足夠的空間就會(huì)發(fā)生緩沖區(qū)溢出。而人為的溢出則是有一定企圖的,攻擊者寫一個(gè)超過緩沖區(qū)長度的字符串,植入到緩沖區(qū),然后再向一個(gè)有限空間的緩沖區(qū)中植入超長的字符串,這時(shí)可能會(huì)出現(xiàn)兩個(gè)結(jié)果:一是過長的字符串覆蓋了相鄰的存儲(chǔ)單元,引起程序運(yùn)行失敗,嚴(yán)重的可導(dǎo)致系統(tǒng)崩潰;另一個(gè)結(jié)果就是利用這種漏洞可以執(zhí)行任意指令,甚至可以取得系統(tǒng)root特級(jí)權(quán)限。

  緩沖區(qū)是程序運(yùn)行的時(shí)候機(jī)器內(nèi)存中的一個(gè)連續(xù)塊,它保存了給定類型的數(shù)據(jù),隨著動(dòng)態(tài)分配變量會(huì)出現(xiàn)問題。大多時(shí)為了不占用太多的內(nèi)存,一個(gè)有動(dòng)態(tài)分配變量的程序在程序運(yùn)行時(shí)才決定給它們分配多少內(nèi)存。如果程序在動(dòng)態(tài)分配緩沖區(qū)放入超長的數(shù)據(jù),它就會(huì)溢出了。一個(gè)緩沖區(qū)溢出程序使用這個(gè)溢出的數(shù)據(jù)將匯編語言代碼放到機(jī)器的內(nèi)存里,通常是產(chǎn)生root權(quán)限的地方。僅僅單個(gè)的緩沖區(qū)溢出并不是問題的根本所在。但如果溢出送到能夠以root權(quán)限運(yùn)行命令的區(qū)域,一旦運(yùn)行這些命令,那可就等于把機(jī)器拱手相讓了。

  造成緩沖區(qū)溢出的原因是程序中沒有仔細(xì)檢查用戶輸入的參數(shù)。例如下面程序:

  example1.c

  void func1(char *input) {

  char buffer[16];

  strcpy(buffer, input);

  }

  上面的strcpy()將直接吧input中的內(nèi)容copy到buffer中。這樣只要input的長度大于16,就會(huì)造成buffer的溢出,使程序運(yùn)行出錯(cuò)。存在像strcpy這樣的問題的標(biāo)準(zhǔn)函數(shù)還有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循環(huán)內(nèi)的getc(),fgetc(),getchar()等。

  當(dāng)然,隨便往緩沖區(qū)中填東西造成它溢出一般只會(huì)出現(xiàn)Segmentation fault 錯(cuò)誤,而不能達(dá)到攻擊的目的。最常見的手段是通過制造緩沖區(qū)溢出使程序運(yùn)行一個(gè)用戶shell,再通過shell執(zhí)行其他命令。如果該程序?qū)儆趓oot且有suid權(quán)限的話,攻擊者就獲得了一個(gè)有root權(quán)限的shell,便可以對(duì)系統(tǒng)進(jìn)行任意操作了。

  請注意,如果沒有特別說明,下面的內(nèi)容都假設(shè)用戶使用的平臺(tái)為基于Intel x86 CPU的Linux系統(tǒng)。對(duì)其他平臺(tái)來說,本文的概念同樣適用,但程序要做相應(yīng)修改。

  二、制造緩沖區(qū)溢出

  一個(gè)程序在內(nèi)存中通常分為程序段、數(shù)據(jù)段和堆棧三部分。程序段里放著程序的機(jī)器碼和只讀數(shù)據(jù)。數(shù)據(jù)段放的是程序中的靜態(tài)數(shù)據(jù)。動(dòng)態(tài)數(shù)據(jù)則通過堆棧來存放。在內(nèi)存中,它們的位置是:

  當(dāng)程序中發(fā)生函數(shù)調(diào)用時(shí),計(jì)算機(jī)做如下操作:首先把參數(shù)壓入堆棧;然后保存指令寄存器(IP)中的內(nèi)容作為返回地址(RET);第三個(gè)放入堆棧的是基址寄存器(FP);然后把當(dāng)前的棧指針(SP)拷貝到FP,做為新的基地址;最后為本地變量留出一定空間,把SP減去適當(dāng)?shù)臄?shù)值。以下面程序?yàn)槔?/p>

  example2.c

  void func1(char * input) {

  char buffer[16];

  strcpy(buffer, input);

  }

  void main() {

  char longstring[256];

  int i;

  for( i = 0; i < 255; i++)

  longstring [i] = 'B';

  func1(longstring);

  }

  當(dāng)調(diào)用函數(shù)func1()時(shí),堆棧如下:

  不用說,程序執(zhí)行的結(jié)果是"Segmentation fault (core dumped)"或類似的出錯(cuò)信息。因?yàn)閺腷uffer開始的256個(gè)字節(jié)都將被* input的內(nèi)容'B'覆蓋,包括sfp, ret,甚至*input。'B'的16進(jìn)值為0x41,所以函數(shù)的返回地址變成了0x41414141,這超出了程序的地址空間,所以出現(xiàn)段錯(cuò)誤。

  三、緩沖區(qū)溢出漏洞攻擊方式

  緩沖區(qū)溢出漏洞可以使任何一個(gè)有黑客技術(shù)的人取得機(jī)器的控制權(quán)甚至是最高權(quán)限。一般利用緩沖區(qū)溢出漏洞攻擊root程序,大都通過執(zhí)行類似“exec(sh)”的執(zhí)行代碼來獲得root 的shell。黑客要達(dá)到目的通常要完成兩個(gè)任務(wù),就是在程序的地址空間里安排適當(dāng)?shù)拇a和通過適當(dāng)?shù)某跏蓟拇嫫骱痛鎯?chǔ)器,讓程序跳轉(zhuǎn)到安排好的地址空間執(zhí)行。

  1、在程序的地址空間里安排適當(dāng)?shù)拇a

  在程序的地址空間里安排適當(dāng)?shù)拇a往往是相對(duì)簡單的。如果要攻擊的代碼在所攻擊程序中已經(jīng)存在了,那么就簡單地對(duì)代碼傳遞一些參數(shù),然后使程序跳轉(zhuǎn)到目標(biāo)中就可以完成了。攻擊代碼要求執(zhí)行“exec(‘/bin/sh’)”,而在libc庫中的代碼執(zhí)行“exec(arg)”,其中的“arg”是個(gè)指向字符串的指針參數(shù),只要把傳入的參數(shù)指針修改指向“/bin/sh”,然后再跳轉(zhuǎn)到libc庫中的響應(yīng)指令序列就可以了。當(dāng)然,很多時(shí)候這個(gè)可能性是很小的,那么就得用一種叫“植入法”的方式來完成了。當(dāng)向要攻擊的程序里輸入一個(gè)字符串時(shí),程序就會(huì)把這個(gè)字符串放到緩沖區(qū)里,這個(gè)字符串包含的數(shù)據(jù)是可以在這個(gè)所攻擊的目標(biāo)的硬件平臺(tái)上運(yùn)行的指令序列。緩沖區(qū)可以設(shè)在:堆棧(自動(dòng)變量)、堆(動(dòng)態(tài)分配的)和靜態(tài)數(shù)據(jù)區(qū)(初始化或者未初始化的數(shù)據(jù))等的任何地方。也可以不必為達(dá)到這個(gè)目的而溢出任何緩沖區(qū),只要找到足夠的空間來放置這些攻擊代碼就夠了。

  2、控制程序轉(zhuǎn)移到攻擊代碼的形式

  緩沖區(qū)溢出漏洞攻擊都是在尋求改變程序的執(zhí)行流程,使它跳轉(zhuǎn)到攻擊代碼,最為基本的就是溢出一個(gè)沒有檢查或者其他漏洞的緩沖區(qū),這樣做就會(huì)擾亂程序的正常執(zhí)行次序。通過溢出某緩沖區(qū),可以改寫相近程序的空間而直接跳轉(zhuǎn)過系統(tǒng)對(duì)身份的驗(yàn)證。原則上來講攻擊時(shí)所針對(duì)的緩沖區(qū)溢出的程序空間可為任意空間。但因不同地方的定位相異,所以也就帶出了多種轉(zhuǎn)移方式。

  (1)Function Pointers(函數(shù)指針)

  在程序中,“void (* foo) ( )”聲明了個(gè)返回值為“void” Function Pointers的變量“foo”。Function Pointers可以用來定位任意地址空間,攻擊時(shí)只需要在任意空間里的Function Pointers鄰近處找到一個(gè)能夠溢出的緩沖區(qū),然后用溢出來改變Function Pointers。當(dāng)程序通過Function Pointers調(diào)用函數(shù),程序的流程就會(huì)實(shí)現(xiàn)。

  (2)Activation Records(激活記錄)

  當(dāng)一個(gè)函數(shù)調(diào)用發(fā)生時(shí),堆棧中會(huì)留駐一個(gè)Activation Records,它包含了函數(shù)結(jié)束時(shí)返回的地址。執(zhí)行溢出這些自動(dòng)變量,使這個(gè)返回的地址指向攻擊代碼,再通過改變程序的返回地址。當(dāng)函數(shù)調(diào)用結(jié)束時(shí),程序就會(huì)跳轉(zhuǎn)到事先所設(shè)定的地址,而不是原來的地址。這樣的溢出方式也是較常見的。

  (3)Longjmp buffers(長跳轉(zhuǎn)緩沖區(qū))

  在C語言中包含了一個(gè)簡單的檢驗(yàn)/恢復(fù)系統(tǒng),稱為“setjmp/longjmp”,意思是在檢驗(yàn)點(diǎn)設(shè)定“setjmp(buffer)”,用longjmp(buffer)“來恢復(fù)檢驗(yàn)點(diǎn)。如果攻擊時(shí)能夠進(jìn)入緩沖區(qū)的空間,感覺“longjmp(buffer)”實(shí)際上是跳轉(zhuǎn)到攻擊的代碼。像Function Pointers一樣,longjmp緩沖區(qū)能夠指向任何地方,所以找到一個(gè)可供溢出的緩沖區(qū)是最先應(yīng)該做的事情。

轉(zhuǎn)載請注明來自發(fā)表學(xué)術(shù)論文網(wǎng):http:///dzlw/1563.html