1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          網絡攻防實戰技術之——緩沖區溢出篇

          來源:互聯網轉載 時間:2024-01-29 08:10:10

          網絡攻防實戰技術之——緩沖區溢出篇

          內容摘要

          1. 緩沖區溢出相關概念

          2. 緩沖區溢出原理

          3. 溢出保護技術

          4. 安全編程技術

          學習要求

          1. 了解緩沖區溢出的相關概念

          2. 明確緩沖區溢出的危害

          3. 理解棧溢出、堆溢出、整型溢出、格式化字符串溢出及文件流溢出的原因

          4. 掌握安全編程技術

          引言-緩沖區溢出的歷史

          1. 1988年的Morris蠕蟲病毒,感染了6000多臺機器:利用UNIX服務finger中的緩沖區溢出漏洞來獲得訪問權限,得到一個shell

          2. 1996年前后,開始出現大量的緩沖區溢出攻擊,因此引起人們的廣泛關注

          3. 源碼開放的操作系統首當其沖

          4. 隨后,Windows系統下的緩沖區溢出也相繼被發掘出來

          5. 已經有一些非常經典細致的文章來介紹與緩沖區溢出有關的技術

          6. 這兩年廣泛流行的一些Internet worms利用了一些緩沖區溢出漏洞

          緩沖區溢出相關概念

          緩沖區

            從程序的角度,緩沖區就是應用程序用來保存用戶輸入數據、程序臨時數據的內存空間

            緩沖區的本質:數組

            存儲位置 :Stack(棧) 、Heap(堆) 、數據段

          緩沖區溢出

            如果用戶輸入的數據長度超出了程序為其分配的內存空間,這些數據就會覆蓋程序為其它數據分配的內存空間,形成所謂的緩沖區溢出

          為什么會緩沖區溢出?

          1. 在C語言中,指針和數組越界不保護是Buffer overflow的根源,而且,在C語言標準庫中就有許多能提供溢出的函數,如strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets()和scanf()

          2. 通過指針填充數據

          3. 不好的編程習慣

          4. 溢出類型:棧溢出、堆溢出

          利用緩沖區溢出進行的攻擊

          ?1.?基本的思想

            通過修改某些內存區域,把一段惡意代碼存儲到一個buffer中,并且使這個buffer被溢出,以便當前進程被非法利用(執行這段惡意的代碼)

          2. 危害性

            a. 在UNIX平臺上,通過發掘Buffer Overflow, 可以獲得一個交互式的shell

            b. 在Windows平臺上,可以上載并執行任何的代碼

            c. 溢出漏洞發掘起來需要較高的技巧和知識背景,但是,一旦有人編寫出溢出代碼,則用起來非常簡單

            d. 與其他的攻擊類型相比,緩沖區溢出攻擊

              i.?不需要太多的先決條件

              ii.?殺傷力很強

              iii.?技術性強

            e. 在Buffer Overflows攻擊面前,防火墻往往顯得很無奈

          利用緩沖區溢出的攻擊

          1.?隨便往緩沖區中填東西造成它溢出一般只會出現“分段錯誤”(Segmentation fault),而不能達到攻擊的目的。

          2. 如果覆蓋緩沖區的是一段精心設計的機器指令序列,它可能通過溢出,改變返回地址,將其指向自己的指令序列,從而改變該程序的正常流程。

          程序指令流被改變后……

          1.?溢出之后,讓程序執行我們指定的代碼

            a. 我們自己提供的一段代碼

            b. 系統現有的調用

          2. 由于這段代碼往往不能太長,所以需要精心設計,并且充分利用系統中現有的函數和指令

          3. 對于不同的操作系統

            a. Linux/Unix,盡可能地得到一個shell(最好是root shell)

            b. Windows,一個可以遠程建立連接的telnet會話

          4. 通用的模式

            a. 找到具有漏洞的程序(vulnerable program )

            b. 編寫出shellcode,

            c. 然后編寫把shellcode送到漏洞程序的程序(稱為exploit)

          Windows平臺下緩沖區溢出

          ?過程

          1. 發現目標

            a.?找到有漏洞的程序,如果在輸入非正常字符串的時候,出現下圖的情形

            b. 或者從程序中找漏洞,用好的反匯編工具,加上耐心

              i.?以一個特定的字符串作為線索,跟蹤到strcpy這樣的函數,看是否有邊界檢查

            c. 編寫shellcode

            d. 編寫exploit程序,并試驗,直到成功

          簡單溢出實例

          #include <stdio.h>int main(){    char name[8] = {0};    printf(“Your name:”);    gets(name);    printf(“Hello,%s!”,name);    return 0;}

          當程序輸入內容超過8個字符串時,程序出錯!

          緩沖區溢出的危害

          1. 應用程序異常

          2. 系統不穩定甚至崩潰

          3. 程序跳轉到惡意代碼,控制權被竊

          緩沖區溢出原理

          預備知識

            1. 理解程序內存空間

            2. 理解堆棧

            3. 理解函數調用過程

            4. 理解緩沖區溢出的原理

          Windows環境下的堆棧

          1.?程序空間由何構成?

          2. 堆棧是什么?

          3. 堆棧里面放的都是什么信息?

          4. 程序使用超過了堆棧默認的大小怎么辦?

          5. 在一次函數調用中,堆棧是如何工作的?

          程序在內存中的映像

          1. 棧是一塊連續的內存空間——就像一個杯子

            a. 先入后出

            b. 生長方向與內存的生長方向正好相反, 從高地址向低地址生長

          2. 每一個線程有自己的棧

            a. 提供一個暫時存放數據的區域

          3. 使用 POP / PUSH 指令來對棧進行操作

          4. 使用 ESP 寄存器指向棧頂,EBP 指向棧幀底

          棧內容

          1. 函數的參數

          2. 函數返回地址

          3. EBP 的值

          4. 一些通用寄存器 ( EDI , ESI … ) 的值

          5. 當前正在執行的函數的局部變量

          三個重要的寄存器

          1.?SP ( ESP )

            即棧頂指針,隨著數據入棧出棧而發生變化

          2. BP ( EBP )

            即基地址指針,用于標識棧中一個相對穩定的位置。通過 BP ,可以方便地引用函數參數以及局部變量

          3. IP ( EIP )?

            即指令寄存器,在將某個函數的棧幀壓入棧中時,其中就包含當前的 IP 值,即函數調用返回后下一個執行語句的地址

          函數調用過程

          1. 把參數壓入棧

          2. 保存指令寄存器中的內容,作為返回地址

          3. 放入堆棧當前的基址寄存器

          4. 把當前的棧指針 ( ESP )拷貝到基址寄存器,作為新的基地址

          5. 為本地變量留出一定空間,把 ESP 減去適當的數值

          函數調用中棧的工作過程

          調用函數前

            壓入棧

              上級函數傳給 A 函數的參數

              返回地址 ( EIP )

              當前的 EBP

              函數的局部變量

          調用函數后

            恢復 EBP

            恢復 EIP

            局部變量不作處理

          例子1

          #include <stdio.h>#include <string.h>void foo(const char* input){   char stack[10];   strcpy(stack,input);}void bar(){   printf("nAh,I've been hacked!n");}void main(int argc,char *argv[]){   foo(argv[1]);}

          例子2

          int main(){    AFunc(5,6);     return 0;}int AFunc(int i,int j){    int m = 3;    int n = 4;????m = i;n = j;????BFunc(m,n);????return 8;}int BFunc(int i,int j){  int m = 1;  int n = 2;  m = i;  n = j;  return m;}

          函數調用中棧的工作過程

          ?視頻播放地址:https://www.bilibili.com/video/av39992797/

          當緩沖區溢出發生時……

          緩沖區溢出原理及其利用

          緩沖區溢出種類

            1. 棧溢出

            2. 堆溢出

            3. 整型溢出

            4. 格式化字符串溢出

            5. 其他溢出

          棧溢出

          特點

            1. 緩沖區在棧中分配

            2. 拷貝的數據過長

            3. 覆蓋了函數的返回地址或其它一些重要數據結構、函數指針

          棧溢出實例

          代碼:

          #include <stdio.h>#include <string.h>int output(){    printf("outputn");    return 0;}int main(){    char szBuf[8] = {0};        //int * 取地址      (int)強制轉為int      *(int *)((int)szBuf+12) = (int)(int *) (output);    printf("mainn");    return 0;}

          ?PS:可以看到 main 字符 先 output 字符打印,即證明了main返回到了output函數!!!!

          ?代碼:

          #include <stdio.h>#include <string.h>int BFunc(int i,int j){      int m = 1;      int n = 2;      m = i;      n = j;      return m;}int AFunc(int i,int j){    int m = 3;    int n = 4;    char szBuf[8] = {0};    *(int *)((int)szBuf+20) = (int)(int *)BFunc;    m = i;    n = j;    BFunc(m,n);    return 8;}int main(){    char szBuf[8] = {0};    AFunc(5,6);    return 0;}

          ?PS:ppt上寫的是

          *(int *)((int)szBuf+20) = BFunc;這樣寫編譯不通過,不能單獨使用BFunc函數名獲得BFunc的地址

          堆溢出

          1. 堆和棧有何區別

            a. 內存的動態分配與靜態分配

            b. 數據增長方向

          2. 堆溢出特點

            a. 緩沖區在堆中分配

            b. 拷貝的數據過長

            c. 覆蓋了堆管理結構

          #define  BUFLEN 32int main(int argc, char* argv[ ]){    char *buf1;    buf1 = (char*)malloc(BUFLEN);    strcpy(buf1,argv[1]);         printf("%sn",buf1);            free(buf1);            return 0;}

          關于堆溢出

          比較少引起人們的關注,原因在于

            1. 比棧溢出難度更大

            2. 需要結合其他的技術,比如

              a.?函數指針改寫

              b.?Vtable改寫

              c.?Malloc庫本身的漏洞

            3. 對于內存中變量的組織方式有一定的要求

          整型溢出

          1. 寬度溢出(Widthness Overflow)

            嘗試存儲一個超過變量表示范圍的大數到變量中

          2. 運算溢出(Arithmetic Overflow)

            如果存儲值是一個運算操作,稍后使用這個結果的程序的任何一部分都將錯誤的運行,因為這個計算結果是不正確的。

          3. 符號溢出(Signedness Bug)

            一個無符號的變量被看作有符號,或者一個有符號的變量被看作無符號

          PS:memcpy指的是c和c++使用的內存拷貝函數,memcpy函數的功能是從源內存地址的起始位置開始拷貝若干個字節到目標內存地址中。

          該函數的復制內存過程中,是不檢查數據邊界的。

          寬度溢出示例

          #include <stdio.h>#include <string.h>#include <stdlib.h>void main(int argc,char* argv[]){        unsigned short s;  // 無符號short類型數據占 4 個字節          int i;             // int類型數據占 8 個字節    char buf[80];            i = atoi(argv[1]);//將字符串轉換為整型數據  , 數據 太長 將被截斷,轉換出錯      s = i;        if(s >= 80)                 return;        memcpy(buf,argv[2],i);}

          運算溢出示例

          void CopyIntArray(int *array,int len){    int* myarray,i;    myarray = malloc(len*sizeof(int));    if(myarray == NULL)        return;    for(i=0;i<len;i++)        myarray[i] = arrary[i];}

          符號溢出示例

          當len變量數據足夠長時,將導致len為負數,繞過len>size的判斷,導致溢出

          #include <stdio.h>#include <string.h>#include <stdlib.h>void CopySomething(char *buf,int len){        char kbuf[8];        int size = sizeof(kbuf);        if(len > size)                return;        printf("buf=%s,len=%d,size=%dn",buf,len,size);            memcpy(kbuf,buf,len);    for(int i=0;i<size+10;i++)        printf("kbuf=%cn",kbuf[i]);}void main(int argc,char* argv[]){        char * buf = "123456789012";    int len = 123456789012;    CopySomething(buf,len);}

          格式化字符串溢出

          關鍵字

            “%n”

          產生原因

            printf()是不定參數輸入

            printf()不會檢查輸入參數的個數

          其他溢出類型

          .data section溢出

          PEB/TEB溢出

          文件流溢出

          歸納

          溢出的共性

            1. 大object向小object復制數據(字符串或整型),容納不下造成溢出

            2. 溢出會覆蓋一些關鍵性數據(返回地址、管理數據、異常處理或文件指針等)

            3. 利用程序的后續流程,得到程序的控制權

          緩沖區溢出的利用

          char szBuf[8] = {0};strcpy(szBuf,argv[2]);

          ?argv[2]的內容:

            1. 對EIP的填充

            2. Shellcode

          Shellcode

          1. Shellcode其實就是一段可以完成某種特定功能的二進制代碼

          2. Shellcode的功能

            a. 基本功能

              1)?添加administrator or root組用戶

              2)?遠程可用shell

              3)?下載程序(Trojan or Rootkit)執行

            b. 高級功能

              1)?抗NIDS檢測

              2)?穿透防火墻

          Shellcode不通用

          ?Shellcode為什么不通用

            1. 不同硬件平臺

              IBM PC、Alpha,PowerPC

            2. 不同系統平臺

              Unix、Windows

            3. 不同內核與補丁版本

            4. 不同漏洞對字符串限制不同

          ?利用緩沖區溢出的攻擊實例

          login: zchPassword:Last login: Fri Jan 12 15:21:34 from 210.34.6.82Sun Microsystems Inc.   SunOS 5.6       Generic August 1997You have mail.$ whozch        pts/1        Jan 12 15:22    (linuxlab.xmu.edu.cn)$ lpsetUsage: lpset [-n (system|xfn) ] [-x] [-a key=value] [-d key] (printer)#查看是否有lpset程序$ ./lpset2 944 1600 2Usages: ./lpset2 <bufsize> <offset> <align>Using RET address = 0xefffff40  ,Offset = 1600, Align= 2# iduid=0(root) gid=1(other)#入侵成功。lpset2源程序可在綠盟站點下載。

          格式化字符串溢出攻擊

          格式化字符串溢出攻擊

            格式化字符串:就是在*printf()系列函數中按照一定的格式對數據進行輸出,可以輸出到標準輸出,即printf(),也可以輸出到文件句柄,字符串等。

            黑客可以利用的幾個條件:

              (1)參數個數不固定造成訪問越界數據

              (2)利用%n/%hn格式符寫入跳轉地址

              (3)利用附加格式符控制跳轉地址的值

          ?一個簡單的例子:

          int main(){    long retloc = 0;    long shell_addr = 0xffbeffac, reth, retl;    char buf[256], buf1[256];    reth = (shell_addr >> 16) & 0xffff ;    retl = (shell_addr >>  0) & 0xffff ;    sprintf(buf, "%%.%uu%%hn%%%uc%%hn", reth , retl - reth + 0x10000);    printf("Before overwrite: retloc = 0x%.8xn", retloc);    printf(buf, 'A', &retloc, 'B', (char*)(&retloc) + 2 );    printf("After overwrite: retloc = 0x%.8xn", retloc);}

          程序執行結果:

            Before overwrite: retloc = 0x00000000

            After overwrite: retloc = 0xffacffbe

          程序執行分析:

            printf("%.65470u%hn%65518c%hn", 'A', &retloc, 'B', (char*)(&retloc) + 2 );

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          移動Sim大卡換小卡?機主本人攜帶身份證,到任意一家移動營業廳,說可以辦理換卡業務。營業廳會根據您的需求更換大小合適的手機卡。以前手機卡是大卡,后來換成了minisim卡,就是老人機用的那種。隨著技術要求和變化,現在是micro sim卡,大部分手機都可以插。我的卡是外地的,可以去當地移動營業廳換小卡或者剪卡嗎?你可以 不要換一張小卡片。如果你的卡是大卡,你只能去手機店換,讓它給你剪成小卡。想換小...

          太原最好的十大公立幼兒園?排名前十的公立幼兒園是。省立幼兒園。于穎幼兒園軍區幼兒園。等一下。但是,家長不應該在幼兒園承擔教育的全部責任,而應該花時間陪伴和教育孩子,讓孩子有安全感,健康成長。太原最好的十大公立幼兒園?太原的頂尖幼兒園,希望對有需要的家長有用。1、于穎太原市少年?種植植物的土地/公共娛樂場所2、太原揚帆少年?種植植物的土地/公共娛樂場所3.太原藍盾少年?種植植物的土地/公共娛樂場所4...

          plugin是什么文件?1.在QQ文件夾下,有一個名為plugin的文件夾,這是一個QQ插件程序。2.nowplugin壓縮文件是什么?以電腦為例,nowplugin不是文件,它是電腦應用程序,它和主機應用程序(application)相互作用,提供特定的功能,可以說是一個插件。chromeplugin是什么軟件?這是一個插件,可以完成您想要的各種功能。如果不安裝插件,速度會更快。如果你安裝它,它...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>