溢出漏洞原理及利用(1)

溢出漏洞原理及利用

本文是作者學習過程的筆記整理而來的,如有錯誤,還請見諒!

實驗環境

  • Windows 10
  • Visual Sutdio 2015
  • x32dbg(x64dbg)
  • *010Editor

實驗目的

  • 學習溢出漏洞的原理
  • 學會手工查看程序崩潰日誌
  • 利用程序的溢出漏洞執行自己的代碼

編寫一個簡單的有溢出漏洞的程序

代碼:

// ConsoleApplication_shellcode.cpp : 定義控制檯應用程序的入口點。
//即與ConsoleApplication_shellcode.exe是一個程序

#include "stdafx.h"
#include<windows.h>

int VerifyPassword(char* pszPassword,int nSize)
{
    char szBuffer[50]={0};
    memcpy(szBuffer, pszPassword, nSize);
    return strcmp("Hades", szBuffer);
}

int main()
{
    int nFlag = 0;
    char szPassword[0x200] = {0};
    FILE* fp;
    LoadLibraryA("user32.dll");
    if (NULL == (fp = fopen("password.txt", "rb")))
    {
        MessageBoxA(NULL, "Open File Fail", "error", NULL);
        exit(0);
    }
    fread(szPassword, sizeof(szPassword), 1, fp);
    nFlag = VerifyPassword(szPassword, sizeof(szPassword));
    if (nFlag)
    {
        printf("password err\n");
    }
    else
    {
        printf("password ok\n");
    }
    fclose(fp);
    system("pause");
    return 0;
}

項目設置:
爲了程序忽視警告正常生成,也爲了之後測試方便,需要配置一下項目環境
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
編譯運行:
代碼完成,項目設置完成,直接編譯成exe
運行前新建一個password.txt,打開其輸入一些字符,雙擊測試exe
這裏寫圖片描述
程序崩潰(自己故意寫的崩潰代碼,這效果是當然正常.其實崩潰在函數返回),一個有溢出漏洞的測試程序完成.

查看程序崩潰日誌,找到崩潰點

查看日誌
打開 控制面板-管理工具-事件查看器-Windows日誌-應用程序
找到崩潰程序的日誌,查看信息如圖
異常代碼:0xC0000005—————表示內存訪問異常
異常錯誤偏移量:0x38383838—–即輸入的8888的ASCII碼
這裏寫圖片描述
定位錯誤
爲了定位錯誤,把文本改爲如下圖字符串
(中途VS程序出現問題,重新又寫了一次源程序,所以程序名稱有點不一樣,實際
ConsoleApplication_bug.exe==ConsoleApplication_shellcode.exe):
這裏寫圖片描述
再次運行程序,查看崩潰日誌
這裏寫圖片描述
找到password.txt中的0xE3E4處,改成1111測試
這裏寫圖片描述
錯誤偏移量正好是1111的ASCII碼,所以正確定位到了錯誤地址處.
調試驗證
使用x32dbg調試器打開程序驗證剛纔測試的溢出地址
這裏寫圖片描述
執行過memcpy函數
這裏寫圖片描述
棧中的地址數據爲0x31313131.
所以驗證正確.memcpy函數拷貝字節過多,淹沒了VerifyPassword函數棧中的返回地址.所以返回時找不到錯誤數據地址中的代碼.(如果地址爲系統領空,系統拒絕訪問,自然報異常0xC0000005)
這就是一個簡單的例子,也是溢出漏洞的產生原理

PS:
本來是個很長的文章,後邊會簡單說利用這個溢出地址執行一些簡單代碼.但是今天很晚了,明天寫在下一篇文章裏吧
第一次寫博客文章.跟筆記不一樣,總是改改改.大家見諒.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章