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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 緩沖溢出原理.htm

?? Smashing The Stack For Fun And Profit 以娛樂和牟利為目的踐踏堆棧 (緩沖區溢出的原理和實踐)
?? HTM
?? 第 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>標題:緩沖區溢出的原理和實踐(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>發信人: Sinbad &lt;MicroBin@263.net&gt;
標  題: 緩沖區溢出的原理和實踐(Phrack)
發信站: 辛巴達 (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
                          以娛樂和牟利為目的踐踏堆棧
                          (緩沖區溢出的原理和實踐)
                     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    匯編的基礎知識是必需的. 對虛擬內存的概念, 以及使用gdb的經驗是十分有益
的, 但不是必需的. 我們還假定使用Intel x86 CPU, 操作系統是Linux.

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

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

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

    數據區域包含了已初始化和未初始化的數據. 靜態變量儲存在這個區域中. 數
據區域對應可執行文件中的data-bss段. 它的大小可以用系統調用brk(2)來改變.
如果bss數據的擴展或用戶堆棧把可用內存消耗光了, 進程就會被阻塞住, 等待有了
一塊更大的內存空間之后再運行. 新內存加入到數據和堆棧段的中間.

                             /------------------\  內存低地址
                             |                  |  
                             |       文本       |  
                             |                  |
                             |------------------|
                             |    (已初始化)    |
                             |        數據      |
                             |    (未初始化)    |
                             |------------------|
                             |                  |
                             |       堆棧       |  
                             |                  |  
                             \------------------/  內存高地址

                              Fig. 1 進程內存區域

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

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

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


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

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


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

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

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

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

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

    當一個例程被調用時所必須做的第一件事是保存前一個FP(這樣當例程退出時就可以
恢復). 然后它把SP復制到FP, 創建新的FP, 把SP向前移動為局部變量保留空間. 這稱為
例程的序幕(prolog)工作. 當例程退出時, 堆棧必須被清除干凈, 這稱為例程的收尾
(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);
}
------------------------------------------------------------------------------  
                          
 
    為了理解程序在調用function()時都做了哪些事情, 我們使用gcc的-S選項編譯, 以產
生匯編代碼輸出:

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

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

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

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

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

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


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

                                  
                                   緩沖區溢出
                                  ~~~~~~~~~~~~
    緩沖區溢出是向一個緩沖區填充超過它處理能力的數據所造成的結果. 如何利用這個
經常出現的編程錯誤來執行任意代碼呢? 讓我們來看看另一個例子:

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);
}
------------------------------------------------------------------------------
 
    這個程序的函數含有一個典型的內存緩沖區編碼錯誤. 該函數沒有進行邊界檢查就復
制提供的字符串, 錯誤地使用了strcpy()而沒有使用strncpy(). 如果你運行這個程序就
會產生段錯誤. 讓我們看看在調用函數時堆棧的模樣:

內存低地址                                                         內存高地址

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

堆棧頂部                                                            堆棧底部

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

    因此緩沖區溢出允許我們更改函數的返回地址. 這樣我們就可以改變程序的執行流程.
現在回到第一個例子, 回憶當時堆棧的模樣: 

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

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

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线亚洲免费视频| 亚洲国产精品av| 日韩电影在线一区二区| 欧美三级韩国三级日本一级| 一个色综合av| 欧美丰满少妇xxxxx高潮对白| 亚洲国产一区二区视频| 精品视频一区三区九区| 日韩成人免费在线| 精品国产成人系列| 国产黄人亚洲片| 国产精品乱码一区二区三区软件| 国产精品一区二区在线观看网站 | 亚洲免费观看高清完整版在线| av在线不卡观看免费观看| 亚洲图片欧美激情| 欧美色偷偷大香| 精品中文av资源站在线观看| 久久理论电影网| 91网站在线观看视频| 亚洲愉拍自拍另类高清精品| 在线成人小视频| 国产精品99久久久久久久vr | 一区在线观看免费| 欧美日韩一区在线观看| 九一久久久久久| 国产精品每日更新在线播放网址| 一本到高清视频免费精品| 日本一区中文字幕| 日本一区二区三级电影在线观看 | 亚洲大片精品永久免费| 欧美xxxx在线观看| 色诱亚洲精品久久久久久| 婷婷久久综合九色国产成人| 久久久精品免费观看| 91精品1区2区| 国产曰批免费观看久久久| 亚洲精品videosex极品| 精品伦理精品一区| 色欧美片视频在线观看 | 欧美成人综合网站| 欧美精品日韩一区| 国产一区二区电影| 亚洲国产欧美日韩另类综合| 精品国产网站在线观看| 在线观看亚洲专区| 国产成人精品影院| 青青草91视频| 有坂深雪av一区二区精品| 久久久电影一区二区三区| 欧美性高清videossexo| 懂色av一区二区三区免费观看| 视频一区国产视频| 亚洲日本乱码在线观看| 久久久久国色av免费看影院| 在线电影欧美成精品| 色呦呦网站一区| 高清av一区二区| 精品系列免费在线观看| 日韩精品福利网| 亚洲最大成人网4388xx| 国产精品你懂的| 久久久亚洲精华液精华液精华液| 欧美电影影音先锋| 色94色欧美sute亚洲线路二 | 中文字幕在线不卡| 精品免费一区二区三区| 欧美日韩精品一区二区三区四区 | 欧美激情在线看| 亚洲精品一线二线三线无人区| 91免费观看在线| 成人的网站免费观看| 国产精品一区二区免费不卡| 裸体歌舞表演一区二区| 三级欧美在线一区| 午夜精品久久久久久不卡8050| 亚洲男人的天堂在线aⅴ视频| 国产精品久久久久影院| 国产精品免费观看视频| 亚洲国产精品成人综合| 国产精品久久久久久久久免费桃花| 国产精品女同互慰在线看 | 中文字幕乱码日本亚洲一区二区| 欧美一区三区二区| 欧美老年两性高潮| 欧美日本乱大交xxxxx| 欧美日韩在线播放三区四区| 欧美视频一区二区在线观看| 欧美午夜理伦三级在线观看| 欧美伊人久久大香线蕉综合69| 色婷婷久久久久swag精品| 91久久精品网| 欧美群妇大交群的观看方式| 欧美高清视频在线高清观看mv色露露十八 | 日本电影亚洲天堂一区| 色综合久久九月婷婷色综合| 91精品福利视频| 欧美日韩一卡二卡| 日韩一区二区免费在线观看| 日韩色视频在线观看| 久久久精品人体av艺术| 国产亚洲欧美一区在线观看| 91福利资源站| 91精彩视频在线观看| 欧美中文字幕不卡| 91精品国产乱| 欧美一级二级在线观看| 日韩欧美不卡一区| 国产精品女主播在线观看| 樱桃视频在线观看一区| 日韩高清不卡在线| 国产一区二区久久| 一本久久a久久免费精品不卡| 欧美日韩精品是欧美日韩精品| 欧美成人国产一区二区| 国产精品免费视频观看| 无码av免费一区二区三区试看| 韩国欧美一区二区| 91精品国产入口| 国产精品久久久久影院老司| 亚洲一区二区三区四区五区中文| 久久激情综合网| 色呦呦国产精品| 日韩美女一区二区三区| 亚洲三级电影网站| 久久疯狂做爰流白浆xx| 91在线一区二区| 欧美在线制服丝袜| 久久综合九色综合欧美亚洲| 亚洲美女视频在线观看| 久久国产精品区| 欧美色爱综合网| 国产精品女主播av| 精品影院一区二区久久久| 91极品美女在线| 日本一区二区综合亚洲| 久久疯狂做爰流白浆xx| 在线亚洲免费视频| 国产精品丝袜一区| 九九**精品视频免费播放| 欧美色偷偷大香| 亚洲人成亚洲人成在线观看图片 | 亚洲一二三四在线观看| 国产精品77777竹菊影视小说| 欧美美女喷水视频| 亚洲男人天堂一区| 成人av影视在线观看| 2021国产精品久久精品| 日韩精品久久理论片| 在线观看欧美日本| 亚洲欧洲色图综合| 国产成人精品影视| 久久久五月婷婷| 狠狠色丁香久久婷婷综合丁香| 中文字幕视频一区| 久久国产福利国产秒拍| 欧美日免费三级在线| 亚洲日本护士毛茸茸| 成人丝袜视频网| 国产日韩影视精品| 狠狠色2019综合网| 精品黑人一区二区三区久久| 蜜桃视频在线一区| 欧美精选午夜久久久乱码6080| 一区二区三区在线免费观看| 成年人网站91| 欧美国产综合一区二区| 亚洲成人午夜电影| 91影视在线播放| 怡红院av一区二区三区| 色偷偷88欧美精品久久久 | 欧美一级欧美一级在线播放| 亚洲精品国产无套在线观 | 蜜臀av亚洲一区中文字幕| 在线不卡中文字幕| 日本不卡不码高清免费观看| 欧美亚洲综合色| 五月综合激情网| 精品婷婷伊人一区三区三| 午夜欧美视频在线观看| 91福利资源站| 国产一二三精品| 91久久精品网| 午夜精品一区二区三区免费视频| 色综合久久88色综合天天| 中文字幕亚洲在| 99精品视频一区| 一区二区在线观看视频| 日本精品一区二区三区高清| 亚洲成a人片综合在线| av男人天堂一区| 日韩伦理电影网| 51精品国自产在线| 免费看精品久久片| 欧美激情一区不卡| 精品视频一区二区三区免费| 日韩成人av影视| 国产目拍亚洲精品99久久精品| 91麻豆高清视频| 亚洲国产成人av好男人在线观看|