亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

??

?? 緩沖溢出原理 經(jīng)典哦
??
?? 第 1 頁 / 共 4 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0074)http://sinbad.dhs.org/cgi-bin/bbstpc?board=UNIX&file=M.992565069.A&num=430 -->
<HTML><HEAD><TITLE>辛巴達文章</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK 
href="緩沖溢出原理.files/bbstyle.css" type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2712.300" name=GENERATOR></HEAD>
<BODY><BR><FONT color=#006000 size=4>標(biāo)題:緩沖區(qū)溢出的原理和實踐(Phrack)</FONT><BR>
<CENTER>
<TABLE class=title width="100%">
  <TBODY>
  <TR>
    <TD align=left>作者:Sinbad</A></TD>
    <TD align=right><A class=bar href="javascript:history.back()">返 回</A> <A 
      class=bar 
      href="http://sinbad.dhs.org/cgi-bin/bbspst?board=UNIX&amp;file=M.992565069.A&amp;key=">我要評論</A></TD></TR></TBODY></TABLE>
<TABLE class=doc>
  <TBODY>
  <TR>
    <TD class=doc2><PRE>發(fā)信人: Sinbad &lt;MicroBin@263.net&gt;
標(biāo)  題: 緩沖區(qū)溢出的原理和實踐(Phrack)
發(fā)信站: 辛巴達 (Fri Jun 15 08:31:09 2001)


                               .oO Phrack 49 Oo.

                          Volume Seven, Issue Forty-Nine
                                     
                                  File 14 of 16

                      BugTraq, r00t, and Underground.Org
                                   bring you

                     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                     Smashing The Stack For Fun And Profit
                          以娛樂和牟利為目的踐踏堆棧
                          (緩沖區(qū)溢出的原理和實踐)
                     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                                 原作 by Aleph One
                             aleph1@underground.org
                             
                            翻譯 xuzq@chinasafer.com
                                www.chinasafer.com
                            
        '踐踏堆棧'[C語言編程] n. 在許多C語言的實現(xiàn)中,有可能通過寫入例程
        中所聲明的數(shù)組的結(jié)尾部分來破壞可執(zhí)行的堆棧.所謂'踐踏堆棧'使用的
        代碼可以造成例程的返回異常,從而跳到任意的地址.這導(dǎo)致了一些極為
        險惡的數(shù)據(jù)相關(guān)漏洞(已人所共知).其變種包括堆棧垃圾化(trash the 
        stack),堆棧亂寫(scribble the stack),堆棧毀壞(mangle the stack);
        術(shù)語mung the stack并不使用,因為這從來不是故意造成的.參閱spam?
        也請參閱同名的漏洞,胡鬧內(nèi)核(fandango on core),內(nèi)存泄露(memory 
        leak),優(yōu)先權(quán)丟失(precedence lossage),螺紋滑扣(overrun screw).
        
                                   簡   介
                                   ~~~~~~~
                                  
    在過去的幾個月中,被發(fā)現(xiàn)和利用的緩沖區(qū)溢出漏洞呈現(xiàn)上升趨勢.例如syslog,
splitvt, sendmail 8.7.5, Linux/FreeBSD mount, Xt library, at等等.本文試圖
解釋什么是緩沖區(qū)溢出, 以及如何利用.

    匯編的基礎(chǔ)知識是必需的. 對虛擬內(nèi)存的概念, 以及使用gdb的經(jīng)驗是十分有益
的, 但不是必需的. 我們還假定使用Intel x86 CPU, 操作系統(tǒng)是Linux.

    在開始之前我們給出幾個基本的定義: 緩沖區(qū),簡單說來是一塊連續(xù)的計算機內(nèi)
存區(qū)域, 可以保存相同數(shù)據(jù)類型的多個實例. C程序員通常和字緩沖區(qū)數(shù)組打交道.
最常見的是字符數(shù)組. 數(shù)組, 與C語言中所有的變量一樣, 可以被聲明為靜態(tài)或動態(tài)
的. 靜態(tài)變量在程序加載時定位于數(shù)據(jù)段. 動態(tài)變量在程序運行時定位于堆棧之中.
溢出, 說白了就是灌滿, 使內(nèi)容物超過頂端, 邊緣, 或邊界. 我們這里只關(guān)心動態(tài)
緩沖區(qū)的溢出問題, 即基于堆棧的緩沖區(qū)溢出.

                              進程的內(nèi)存組織形式
                             ~~~~~~~~~~~~~~~~~~~~
    為了理解什么是堆棧緩沖區(qū), 我們必須首先理解一個進程是以什么組織形式在
內(nèi)存中存在的. 進程被分成三個區(qū)域: 文本, 數(shù)據(jù)和堆棧. 我們把精力集中在堆棧
區(qū)域, 但首先按照順序簡單介紹一下其他區(qū)域.

    文本區(qū)域是由程序確定的, 包括代碼(指令)和只讀數(shù)據(jù). 該區(qū)域相當(dāng)于可執(zhí)行
文件的文本段. 這個區(qū)域通常被標(biāo)記為只讀, 任何對其寫入的操作都會導(dǎo)致段錯誤
(segmentation violation).

    數(shù)據(jù)區(qū)域包含了已初始化和未初始化的數(shù)據(jù). 靜態(tài)變量儲存在這個區(qū)域中. 數(shù)
據(jù)區(qū)域?qū)?yīng)可執(zhí)行文件中的data-bss段. 它的大小可以用系統(tǒng)調(diào)用brk(2)來改變.
如果bss數(shù)據(jù)的擴展或用戶堆棧把可用內(nèi)存消耗光了, 進程就會被阻塞住, 等待有了
一塊更大的內(nèi)存空間之后再運行. 新內(nèi)存加入到數(shù)據(jù)和堆棧段的中間.

                             /------------------\  內(nèi)存低地址
                             |                  |  
                             |       文本       |  
                             |                  |
                             |------------------|
                             |    (已初始化)    |
                             |        數(shù)據(jù)      |
                             |    (未初始化)    |
                             |------------------|
                             |                  |
                             |       堆棧       |  
                             |                  |  
                             \------------------/  內(nèi)存高地址

                              Fig. 1 進程內(nèi)存區(qū)域

    
                                  什么是堆棧?
                                 ~~~~~~~~~~~~~

    堆棧是一個在計算機科學(xué)中經(jīng)常使用的抽象數(shù)據(jù)類型. 堆棧中的物體具有一個特性:
最后一個放入堆棧中的物體總是被最先拿出來, 這個特性通常稱為后進先處(LIFO)隊列.

    堆棧中定義了一些操作. 兩個最重要的是PUSH和POP. PUSH操作在堆棧的頂部加入一
個元素. POP操作相反, 在堆棧頂部移去一個元素, 并將堆棧的大小減一.


                                為什么使用堆棧?
                               ~~~~~~~~~~~~~~~~
    現(xiàn)代計算機被設(shè)計成能夠理解人們頭腦中的高級語言. 在使用高級語言構(gòu)造程序時
最重要的技術(shù)是過程(procedure)和函數(shù)(function). 從這一點來看, 一個過程調(diào)用可
以象跳轉(zhuǎn)(jump)命令那樣改變程序的控制流程, 但是與跳轉(zhuǎn)不同的是, 當(dāng)工作完成時,
函數(shù)把控制權(quán)返回給調(diào)用之后的語句或指令. 這種高級抽象實現(xiàn)起來要靠堆棧的幫助.

    堆棧也用于給函數(shù)中使用的局部變量動態(tài)分配空間, 同樣給函數(shù)傳遞參數(shù)和函數(shù)返
回值也要用到堆棧.


                                   堆棧區(qū)域
                                  ~~~~~~~~~~
    堆棧是一塊保存數(shù)據(jù)的連續(xù)內(nèi)存. 一個名為堆棧指針(SP)的寄存器指向堆棧的頂部.
堆棧的底部在一個固定的地址. 堆棧的大小在運行時由內(nèi)核動態(tài)地調(diào)整. CPU實現(xiàn)指令
PUSH和POP, 向堆棧中添加元素和從中移去元素.

    堆棧由邏輯堆棧幀組成. 當(dāng)調(diào)用函數(shù)時邏輯堆棧幀被壓入棧中, 當(dāng)函數(shù)返回時邏輯
堆棧幀被從棧中彈出. 堆棧幀包括函數(shù)的參數(shù), 函數(shù)地局部變量, 以及恢復(fù)前一個堆棧
幀所需要的數(shù)據(jù), 其中包括在函數(shù)調(diào)用時指令指針(IP)的值.   

    堆棧既可以向下增長(向內(nèi)存低地址)也可以向上增長, 這依賴于具體的實現(xiàn). 在我
們的例子中, 堆棧是向下增長的. 這是很多計算機的實現(xiàn)方式, 包括Intel, Motorola,
SPARC和MIPS處理器. 堆棧指針(SP)也是依賴于具體實現(xiàn)的. 它可以指向堆棧的最后地址,
或者指向堆棧之后的下一個空閑可用地址. 在我們的討論當(dāng)中, SP指向堆棧的最后地址.

    除了堆棧指針(SP指向堆棧頂部的的低地址)之外, 為了使用方便還有指向幀內(nèi)固定
地址的指針叫做幀指針(FP). 有些文章把它叫做局部基指針(LB-local base pointer).
從理論上來說, 局部變量可以用SP加偏移量來引用. 然而, 當(dāng)有字被壓棧和出棧后, 這
些偏移量就變了. 盡管在某些情況下編譯器能夠跟蹤棧中的字操作, 由此可以修正偏移
量, 但是在某些情況下不能. 而且在所有情況下, 要引入可觀的管理開銷. 而且在有些
機器上, 比如Intel處理器, 由SP加偏移量訪問一個變量需要多條指令才能實現(xiàn).

    因此, 許多編譯器使用第二個寄存器, FP, 對于局部變量和函數(shù)參數(shù)都可以引用, 
因為它們到FP的距離不會受到PUSH和POP操作的影響. 在Intel CPU中, BP(EBP)用于這
個目的. 在Motorola CPU中, 除了A7(堆棧指針SP)之外的任何地址寄存器都可以做FP.
考慮到我們堆棧的增長方向, 從FP的位置開始計算, 函數(shù)參數(shù)的偏移量是正值, 而局部
變量的偏移量是負值.

    當(dāng)一個例程被調(diào)用時所必須做的第一件事是保存前一個FP(這樣當(dāng)例程退出時就可以
恢復(fù)). 然后它把SP復(fù)制到FP, 創(chuàng)建新的FP, 把SP向前移動為局部變量保留空間. 這稱為
例程的序幕(prolog)工作. 當(dāng)例程退出時, 堆棧必須被清除干凈, 這稱為例程的收尾
(epilog)工作. Intel的ENTER和LEAVE指令, Motorola的LINK和UNLINK指令, 都可以用于
有效地序幕和收尾工作.

    下面我們用一個簡單的例子來展示堆棧的模樣:
    
example1.c:
------------------------------------------------------------------------------
void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}

void main() {
  function(1,2,3);
}
------------------------------------------------------------------------------  
                          
 
    為了理解程序在調(diào)用function()時都做了哪些事情, 我們使用gcc的-S選項編譯, 以產(chǎn)
生匯編代碼輸出:

$ gcc -S -o example1.s example1.c

    通過查看匯編語言輸出, 我們看到對function()的調(diào)用被翻譯成:

        pushl $3
        pushl $2
        pushl $1
        call function
  
    以從后往前的順序?qū)unction的三個參數(shù)壓入棧中, 然后調(diào)用function(). 指令call
會把指令指針(IP)也壓入棧中. 我們把這被保存的IP稱為返回地址(RET). 在函數(shù)中所做
的第一件事情是例程的序幕工作:

        pushl %ebp
        movl %esp,%ebp
        subl $20,%esp

    將幀指針EBP壓入棧中. 然后把當(dāng)前的SP復(fù)制到EBP, 使其成為新的幀指針. 我們把這
個被保存的FP叫做SFP. 接下來將SP的值減小, 為局部變量保留空間.

    我們必須牢記:內(nèi)存只能以字為單位尋址. 在這里一個字是4個字節(jié), 32位. 因此5字節(jié)
的緩沖區(qū)會占用8個字節(jié)(2個字)的內(nèi)存空間, 而10個字節(jié)的緩沖區(qū)會占用12個字節(jié)(3個字)
的內(nèi)存空間. 這就是為什么SP要減掉20的原因. 這樣我們就可以想象function()被調(diào)用時
堆棧的模樣(每個空格代表一個字節(jié)):


內(nèi)存低地址                                                         內(nèi)存高地址
                                                              
           buffer2       buffer1   sfp   ret   a     b     c
&lt;------   [            ][        ][    ][    ][    ][    ][    ]
           
堆棧頂部                                                            堆棧底部
                                                             

                                  
                                   緩沖區(qū)溢出
                                  ~~~~~~~~~~~~
    緩沖區(qū)溢出是向一個緩沖區(qū)填充超過它處理能力的數(shù)據(jù)所造成的結(jié)果. 如何利用這個
經(jīng)常出現(xiàn)的編程錯誤來執(zhí)行任意代碼呢? 讓我們來看看另一個例子:

example2.c
------------------------------------------------------------------------------
void function(char *str) {
   char buffer[16];

   strcpy(buffer,str);
}

void main() {
  char large_string[256];
  int i;

  for( i = 0; i &lt; 255; i++)
    large_string[i] = 'A';

  function(large_string);
}
------------------------------------------------------------------------------
 
    這個程序的函數(shù)含有一個典型的內(nèi)存緩沖區(qū)編碼錯誤. 該函數(shù)沒有進行邊界檢查就復(fù)
制提供的字符串, 錯誤地使用了strcpy()而沒有使用strncpy(). 如果你運行這個程序就
會產(chǎn)生段錯誤. 讓我們看看在調(diào)用函數(shù)時堆棧的模樣:

內(nèi)存低地址                                                         內(nèi)存高地址

                  buffer            sfp   ret   *str
&lt;------          [                ][    ][    ][    ]   

堆棧頂部                                                            堆棧底部

    這里發(fā)生了什么事? 為什么我們得到一個段錯誤? 答案很簡單: strcpy()將*str的
內(nèi)容(larger_string[])復(fù)制到buffer[]里, 直到在字符串中碰到一個空字符. 顯然, 
buffer[]比*str小很多. buffer[]只有16個字節(jié)長, 而我們卻試圖向里面填入256個字節(jié)
的內(nèi)容. 這意味著在buffer之后, 堆棧中250個字節(jié)全被覆蓋. 包括SFP, RET, 甚至*str!
我們已經(jīng)把large_string全都填成了A. A的十六進制值為0x41. 這意味著現(xiàn)在的返回地
址是0x41414141. 這已經(jīng)在進程的地址空間之外了. 當(dāng)函數(shù)返回時, 程序試圖讀取返回
地址的下一個指令, 此時我們就得到一個段錯誤.

    因此緩沖區(qū)溢出允許我們更改函數(shù)的返回地址. 這樣我們就可以改變程序的執(zhí)行流程.
現(xiàn)在回到第一個例子, 回憶當(dāng)時堆棧的模樣: 

內(nèi)存低地址                                                         內(nèi)存高地址
                                                              
           buffer2       buffer1   sfp   ret   a     b     c
&lt;------   [            ][        ][    ][    ][    ][    ][    ]
           
堆棧頂部                                                            堆棧底部

    現(xiàn)在試著修改我們第一個例子, 讓它可以覆蓋返回地址, 而且使它可以執(zhí)行任意代碼.
堆棧中在buffer1[]之前的是SFP, SFP之前是返回地址. ret從buffer1[]的結(jié)尾算起是4個
字節(jié).應(yīng)該記住的是buffer1[]實際上是2個字即8個字節(jié)長. 因此返回地址從buffer1[]的開
頭算起是12個字節(jié). 我們會使用這種方法修改返回地址, 跳過函數(shù)調(diào)用后面的賦值語句
'x=1;', 為了做到這一點我們把返回地址加上8個字節(jié). 代碼看起來是這樣的:

example3.c:
------------------------------------------------------------------------------
void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丝袜脚交一区二区| 欧美哺乳videos| 7777精品伊人久久久大香线蕉超级流畅 | 自拍偷拍国产精品| 久久国产精品99久久久久久老狼 | 男女激情视频一区| 在线观看91av| 首页国产欧美久久| 在线播放日韩导航| 日韩专区一卡二卡| 制服视频三区第一页精品| 天天综合天天综合色| 91精品国产色综合久久不卡蜜臀| 五月激情综合网| 制服丝袜亚洲网站| 免费在线看成人av| 精品国产亚洲在线| 国产精品一区一区三区| 久久精品欧美一区二区三区不卡| 国产一区美女在线| 国产色综合一区| www.亚洲国产| 亚洲综合免费观看高清完整版在线 | 日产国产高清一区二区三区| 日韩一区二区三区四区| 精品一区二区三区欧美| 久久久精品国产免费观看同学| 国产麻豆精品视频| 国产精品久久久久一区二区三区| 97se亚洲国产综合自在线观| 亚洲一区二区三区在线看| 欧美一区二区三区性视频| 精品在线播放午夜| 欧美极品美女视频| 91年精品国产| 午夜伦理一区二区| 久久综合色天天久久综合图片| 国产91精品精华液一区二区三区 | 久久精品一区四区| 不卡的电影网站| 亚洲影视在线观看| 欧美一级专区免费大片| 国产成人免费高清| 一区二区三区免费在线观看| 777久久久精品| 国产一区二区在线视频| 亚洲天堂精品在线观看| 在线播放91灌醉迷j高跟美女| 国产一区二区三区在线观看免费| 国产精品乱码妇女bbbb| 欧美系列亚洲系列| 精久久久久久久久久久| 亚洲色图视频免费播放| 欧美精品丝袜中出| 福利视频网站一区二区三区| 亚洲一二三区不卡| 欧美成人三级在线| 色哟哟欧美精品| 久久丁香综合五月国产三级网站| 国产精品久久久久影院老司| 在线不卡一区二区| 北条麻妃一区二区三区| 爽好久久久欧美精品| 国产日韩精品一区二区三区| 欧美三级在线看| 国产精品系列在线播放| 亚洲成人福利片| 国产亚洲欧美激情| 欧美日韩黄色一区二区| 国产成人av一区| 午夜激情一区二区三区| 国产精品久久久久久妇女6080| 欧美人伦禁忌dvd放荡欲情| 福利视频网站一区二区三区| 日韩精品一区第一页| 国产精品麻豆欧美日韩ww| 日韩亚洲欧美在线| 91成人看片片| 国产成人在线视频免费播放| 五月天久久比比资源色| 中文字幕一区二区三区视频| 精品国产91久久久久久久妲己| 色视频成人在线观看免| 成人自拍视频在线观看| 人人精品人人爱| 亚洲美腿欧美偷拍| 欧美激情在线免费观看| 欧美一卡2卡三卡4卡5免费| 91传媒视频在线播放| 国产成人久久精品77777最新版本| 午夜国产不卡在线观看视频| 综合色天天鬼久久鬼色| 精品国产91亚洲一区二区三区婷婷| 欧美午夜精品一区| av在线这里只有精品| 狠狠色丁香婷综合久久| 日韩精品亚洲专区| 亚洲综合免费观看高清完整版在线| 中文字幕+乱码+中文字幕一区| 日韩一级二级三级| 欧美日韩一区二区三区视频| av亚洲产国偷v产偷v自拍| 国产精品羞羞答答xxdd| 极品尤物av久久免费看| 日本视频中文字幕一区二区三区| 亚洲五月六月丁香激情| 亚洲图片欧美激情| 国产精品久久久久婷婷| 久久精品欧美日韩精品| 26uuu亚洲| 337p粉嫩大胆噜噜噜噜噜91av | 精品少妇一区二区三区日产乱码 | 91.xcao| 欧美日韩免费观看一区三区| 色呦呦网站一区| 99精品偷自拍| 成人精品免费网站| 国产999精品久久久久久| 国产精品一区免费在线观看| 久久国产精品99精品国产| 日av在线不卡| 美女脱光内衣内裤视频久久网站 | 成年人网站91| 国产69精品一区二区亚洲孕妇| 国内精品在线播放| 国产精品综合在线视频| 韩国欧美国产一区| 激情六月婷婷久久| 国产麻豆精品在线| 国产成人免费视频网站高清观看视频| 激情综合亚洲精品| 韩国视频一区二区| 国精产品一区一区三区mba桃花| 国内外精品视频| 国产一区二区免费在线| 国产风韵犹存在线视精品| 成人动漫一区二区三区| 成人99免费视频| 色女孩综合影院| 欧美艳星brazzers| 欧美美女一区二区三区| 91精品蜜臀在线一区尤物| 精品日韩在线观看| 久久精品网站免费观看| 欧美国产激情二区三区| 中文字幕亚洲欧美在线不卡| 亚洲人成网站精品片在线观看| 亚洲美女视频一区| 亚洲成人资源网| 蜜桃免费网站一区二区三区| 韩国三级在线一区| 成人一级片在线观看| 91视频com| 欧美精品色一区二区三区| 日韩一区二区三区视频在线观看 | 欧美肥妇bbw| 亚洲精品在线观| 中文字幕国产一区二区| 亚洲免费三区一区二区| 亚洲成av人片在www色猫咪| 免费观看一级特黄欧美大片| 国产一区高清在线| 91玉足脚交白嫩脚丫在线播放| 欧美三级日韩三级| 精品99久久久久久| 亚洲天堂av老司机| 午夜久久电影网| 国产一区二区福利视频| 91蜜桃在线观看| 欧美伦理影视网| 国产丝袜美腿一区二区三区| 亚洲精品成人精品456| 日本视频免费一区| 成人黄动漫网站免费app| 欧美性感一区二区三区| 欧美电影免费观看高清完整版| 国产精品高潮呻吟久久| 午夜精品123| 国产成+人+日韩+欧美+亚洲| 在线视频国内一区二区| 日韩免费成人网| 亚洲色图视频免费播放| 理论电影国产精品| 91免费精品国自产拍在线不卡 | 91精品国产美女浴室洗澡无遮挡| 国产三级一区二区三区| 亚洲一区免费在线观看| 国内精品伊人久久久久av影院| 日本高清视频一区二区| 久久伊人蜜桃av一区二区| 亚洲另类在线一区| 国产在线不卡一区| 欧美日韩免费不卡视频一区二区三区 | 在线观看成人小视频| 久久久久综合网| 午夜国产不卡在线观看视频| 成a人片国产精品| 日韩精品综合一本久道在线视频| 综合欧美一区二区三区| 国产一区二区在线电影|