欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

緩沖區(qū)溢出解密一

互聯(lián)網(wǎng)   發(fā)布時間:2008-10-08 19:04:09   作者:佚名   我要評論
緩沖溢出弱點誕生于70年代。Morris Worm(80年代)可以認為是它們的第一次公開應(yīng)用。從90年代開始,相關(guān)的文檔,如著名的Aleph1的”Smashing the Stack for Fun and Profit”和代碼已經(jīng)在互聯(lián)網(wǎng)上公開。 這篇文章是關(guān)于某種需要非常重視的主題的系列文

緩沖溢出弱點誕生于70年代。Morris Worm(80年代)可以認為是它們的第一次公開應(yīng)用。從90年代開始,相關(guān)的文檔,如著名的Aleph1的”Smashing the Stack for Fun and Profit”和代碼已經(jīng)在互聯(lián)網(wǎng)上公開。
這篇文章是關(guān)于某種需要非常重視的主題的系列文章的開始,并且包括了很多的細節(jié);它的目的是解釋和闡明非?;镜穆┒搭愋停此^的本地溢出,而且論述了如何編寫利用這種漏洞的代碼。
為了理解接下來的內(nèi)容,需要一些C和匯編的知識。虛擬內(nèi)存,一些操作系統(tǒng)的基本知識例如象一個進程在內(nèi)存里是如何布局的。你必須知道什么是setuid二進制文件,而且當然你需要至少能夠使用UNIX系統(tǒng)。如果你有g(shù)db/cc調(diào)試編譯的經(jīng)驗,那就非常好了。文檔特定在Linux/ix86環(huán)境下。細節(jié)的不同之處取決于操作系統(tǒng)或者你使用的架構(gòu)。在接下來的文檔里面,將介紹相應(yīng)的更高級的溢出和shellcode技術(shù)。
最新版本的文檔可以在這里找到:
http://www.enderunix.org/documents/eng/bof-eng.txt
什么是溢出?
如果你知道C,你肯定知道什么是字符型數(shù)組。假設(shè)你用C寫代碼,你應(yīng)該已經(jīng)知道數(shù)組的基本特性,象:數(shù)組擁有同樣類型的對象,例如:int,char,float。就像所有的數(shù)據(jù)結(jié)構(gòu)一樣,它們能夠被分成是”靜態(tài)”或者是”動態(tài)”。靜態(tài)變量被填入程序的數(shù)據(jù)段,然而,動態(tài)變量在內(nèi)存中的可執(zhí)行程序的堆棧區(qū)域分配和重新分配。”基于堆棧”的溢出就在這里發(fā)生了,我們在數(shù)據(jù)結(jié)構(gòu)中填更多的數(shù)據(jù),也就是說多于一個數(shù)組能夠存儲的數(shù)據(jù),我們忽略許多重要的數(shù)據(jù)超越這個數(shù)組的界限。簡單的,拷貝20字節(jié)到一個只能存儲12字節(jié)的數(shù)組里。
一個Linux ELF格式二進制的存儲結(jié)構(gòu)相當?shù)膹?fù)雜。特別是在ELF (詳細內(nèi)容,在google中搜索”Executable and Linkable Format”)和共享庫引入后,它已經(jīng)變得更加復(fù)雜。然而,基本上,每一個進程運行時有3段:
1.文本段,是一個只讀部分包括所有的程序指令。對于等同于下面C代碼的指令集合將被包括在這段。
for (i = 0; i
2.數(shù)據(jù)段是初始化了的和未初始化的數(shù)據(jù)(也被認為是BBS段)所在的塊。
if you code;

int i;

the variable is an uninitialized variable, and it'll be stored in
the "uninitialized variables" part of the Data Segment. (BSS)
and, if you code;
int j = 5;
the variable is an initialized variable, and the the space for
the j variable will be allocated in the "initialized variables"
part of the Data Segment.
3.一個被稱為”堆棧”的段,在這里動態(tài)變量(或者在C里面叫自動變量)被分配和重新分配;并且為函數(shù)返回臨時存儲地址。例如,在下面代碼片段中,i變量在堆棧中產(chǎn)生,僅僅在函數(shù)返回后,它就消亡了。
int myfunc(void)
{
int i;

for (i = 0; i 如果我們用符號表示堆棧:
0xBFFFFFFF ---------------------
| |
| . |
| . |
| . |
| . |
| etc |
| env/argv pointer. |
| argc |
|-------------------|
| |
| stack |
| |
| | |
| | |
| V |
/ /
\ \
| |
| ^ |
| | |
| | |
| |
| heap |
|-------------------|
| bss |
|-------------------|
| initialized data |
|-------------------|
| text |
|-------------------|
| shared libraries |
| etc. |
0x8000000 |-------------------|
_* STACK *_
堆棧在基本術(shù)語里面是一個數(shù)據(jù)結(jié)構(gòu),你們都可以從你們的數(shù)據(jù)結(jié)構(gòu)課程記起來。它有同樣的基本操作。它是一個LIFO(后進,先出)的數(shù)據(jù)結(jié)構(gòu)。它的處理過程通過一些特殊的指令象PUSH和POP由CPU直接控制。你PUSH一些數(shù)據(jù)到堆棧里面,又POP一些其它的數(shù)據(jù)。不論誰最后到,它將是最先出來的那個。因此,用專業(yè)術(shù)語說,第一個將被從堆棧中推出來的是最后一個被推進去的。
在CPU中注冊的SP(堆棧指針)包括將要從堆棧中推出來的數(shù)據(jù)地址。不論SP指向最后的數(shù)據(jù)還是堆棧中最后數(shù)據(jù)的后面數(shù)據(jù)是CPU-specific的;然而,我們的目標ix86結(jié)構(gòu),SP指向堆棧中最后數(shù)據(jù)的地址。在ix86保護模式(32位/雙字)下,PUSH和POP指令在4字節(jié)單元中完成。在這里要說的另外一個重要的細節(jié)是堆棧向下增長,也就是,如果SP是0xFF,執(zhí)行PUSH EAX指令后,SP將變成0xFC并且EAX的值將被放到0xFC地址里。 PUSH指令將從ESP(回顧一下上面的圖)中減去4個字節(jié),并且將推入一個雙字到堆棧,放置雙字到ESP寄存器所指的地址中。另一方面,POP指令,讀取ESP寄存器中的地址,POP掉堆棧地址所指的值,并且加4到ESP(加4到ESP寄存器中的地址)。假設(shè)ESP初始化為0x1000,讓我們觀察下面的匯編代碼:
PUSH dword1 ;value at dword1: 1, ESP's value: 0xFFC (0x1000 - 4)
PUSH dword2 ;value at dword2: 2, ESP's value: 0xFF8 (0xFFC - 4)
PUSH dword3 ;value at dword3: 3, ESP's value: 0xFF4 (0xFF8 - 4)
POP EAX ;EAX' value 3, ESP's value: 0xFF8 (0xFF4 4)
POP EBX ;EBX's value 2, ESP's value: 0xFFC (0xFF8 4)
POP ECX ;ECX's value 1, ESP's value: 0x1000 (0xFFC 4)
當堆棧被用做動態(tài)變量的臨時存儲的時候,它被用來存儲一些調(diào)用存儲臨時變量函數(shù)的地址和在函數(shù)間傳遞參數(shù)。而且,當然,這也是邪惡的來場。
EIP寄存器,CALL和RET指令
在每一個機器周期中,CPU查詢指令指針寄存器存儲中存儲的內(nèi)容(在ix86 32位保護模式中是EIP-擴展指令指針)來知道下一步要執(zhí)行什么。下一個將要執(zhí)行的指令地址存儲在EIP寄存器中。通常,地址是連續(xù)的,意味著下個將要執(zhí)行的下個指令在內(nèi)存中比當前指令靠前幾個字節(jié)。CPU根據(jù)當前指令是幾個字節(jié)長度計算出”靠前的幾個字節(jié)”,然后把這幾個字節(jié)值加到當前地址。舉個例子,假設(shè)當前指令地址是0x8048438。這是寫在EIP中的值。因此,CPU執(zhí)行在內(nèi)存地址:0x8048438中找到的指令。比方說,是一個PUSH指令:
push 雙
CPU知道一個PUSH指令是1字節(jié)長,因此下一個指令將在0x8048439,可能是
mov %esp,雙
在執(zhí)行PUSH時,CPU將把MOV地址放到EIP中。

相關(guān)文章

最新評論