堆棧溢出的問題_第1頁
堆棧溢出的問題_第2頁
堆棧溢出的問題_第3頁
堆棧溢出的問題_第4頁
堆棧溢出的問題_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、通過堆棧溢出來獲得 root 權限是目前使用的相當普遍的一項黑客技術。事實上這是一個黑客在系統本地已經擁有了一個基本賬號后的首選攻擊方式。他也被廣泛應用于遠程攻擊。通過對daemon 進程的堆棧溢出來實現遠程獲得 rootshell 的技術,已經被很多實例實現。在 windows 系統中,同樣存在著堆棧溢出的問題。而且,隨著 internet 的普及, win 系列平臺上的internet 服務程序越來越多,低水平的 win 程序就成為你系統上的致命傷。因為它們同樣會被遠程堆棧溢出,而且,由于 win 系統使用者和管理者普遍缺乏安全防范的意識,一臺 win 系統上的堆棧溢出,如果被惡意利用,將

2、導致整個機器被敵人所控制。進而,可能導致整個局域網落入敵人之手。本系列講座將系統的介紹堆棧溢出的機制,原理,應用,以及防范的措施。希望通過我的講座,大家可以了解和掌握這項技術。而且,會自己去尋找堆棧溢出漏洞,以提高系統安全。堆棧溢出系列講座入門篇本講的預備知識:首先你應該了解 intel 匯編語言,熟悉寄存器的組成和功能。你必須有堆棧和存儲分配方面的基礎知識,有關這方面的計算機書籍很多,我將只是簡單闡述原理,著重在應用其次,你應該了解linux,本講中我們的例子將在linux上開發。1:首先復習一下基礎知識。從物理上講,堆棧是就是一段連續分配的內存空間。在一個程序中,會聲明各種變量。靜態全局變

3、量是位于數據段并且在程序開始運行的時候被加載。而程序的動態的局部變量則分配在堆棧里面。從操作上來講,堆棧是一個先入后出的隊列。他的生長方向與內存的生長方向正好相反。我們規定push= ESP 4,出棧的操作是內存的生長方向為向上,則棧的生長方向為向下。壓棧的操作pop=ESP+4. 換句話說,堆棧中老的值,其內存地址,反而比新的值要大。請牢牢記住這一點,因為這是堆棧溢出的基本理論依據。在一次函數調用中,堆棧中將被依次壓入:參數,返回地址,EBP 。如果函數有局部變量,接下來,就在堆棧中開辟相應的空間以構造變量。函數執行結束,這些局部變量的內容將被丟失。但是不被清除。在函數返回的時候,彈出EBP

4、,恢復堆棧到函數調用的地址,彈出返回地址到 EIP以繼續執行程序在C語言程序中,參數的壓棧順序是反向的。比如func( a,b,c)。在參數入棧的時候,是:先壓c,再壓b,最后壓a.在取參數的時候,由于棧的先入后出,先取棧頂的a,再取b,最后取c»( PS:如果你看不懂上面這段概述,請你去看以看關于堆棧的書籍,一般的匯編語言書籍都會詳細的討論堆棧,必須弄懂它,你才能進行下面的學習)2:好了,繼續 ,讓我們來看一看什么是堆棧溢出2.1:運行時的堆棧分配堆棧溢出就是不顧堆棧中分配的局部數據塊大小,向該數據塊寫入了過多的數據,導致數據越界。結果覆蓋了老的堆棧數據。比如有下面一段程序:程序一

5、:#includeint main ( )char name8;printf("Please type your name: ");gets(name);printf("Hello, %s!", name);return 0;編譯并且執行,我們輸入ipxodi, 就會輸出 Hello,ipxodi! 。程序運行中,堆棧是怎么操作的呢?在main函數開始運行的時候,堆棧里面將被依次放入返回地址,EBP。我們用gcc -S來獲得匯編語言輸出,可以看到 main 函數的開頭部分對應如下語句:pushl %ebpmovl %esp,%ebpsubl $8,%es

6、p首先他把EBP保存下來,然后 EBP等于現在的ESP,這樣EBP就可以用來訪問本函數的局部變量。之后ESP減8,就是堆棧向上增長 8個字節,用來存放 name口數組。現在堆棧的布局如下:內存底部 內存頂部name EBP ret< 八&name堆棧頂部 堆棧底部執行完gets(name)之后,堆棧如下:內存底部 內存頂部name EBP ret< ipxodi0 人&name堆棧頂部 堆棧底部最后, main 返回,彈出 ret 里的地址,賦值給 EIP , CPU 繼續執行 EIP 所指向的指令。2.2:堆棧溢出好,看起來一切順利。我們再執行一次,輸入ipxod

7、iAAAAAAAAAAAAAAA, 執行完gets ( name)之后,堆棧如下:內存底部 內存頂部name EBP ret< ipxodiAAAAAAAAAA人&name堆棧頂部 堆棧底部由于我們輸入的name字符串太長,name數組容納不下,只好向內存頂部繼續寫A;由于堆棧的生長方向與內存的生長方向相反,這些A覆蓋了堆棧的老的元素。如圖我們可以發現,EBP,ret都已經被 A覆蓋了。在 main返回的時候,就會把 AAAA的ASCII碼:0x41414141作為返回地址, CPU 會試圖執行 0x41414141 處的指令,結果出現錯誤。這就是一次堆棧溢出。3:如何利用堆棧溢出我們已經制造了一次堆棧溢出。其原理可以概括為:由于字符串處理函數(gets, strcpy等等)沒有對數組越界加以監視和限制,我們利用字符數組寫越界,覆蓋堆棧中的老元素的值,就可以修改 返回地址。在上面的例子中,這導致 CPU 去訪問一個不存在的指令,結果出錯。事實上,當堆棧溢出的時候,我們已經完全的控制了這個程序下一步的動作。如果我們用一個實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論