溢出漏洞原理及利用
本文是作者學習過程的筆記整理而來的,如有錯誤,還請見諒!
實驗環境
- 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:
本來是個很長的文章,後邊會簡單說利用這個溢出地址執行一些簡單代碼.但是今天很晚了,明天寫在下一篇文章裏吧
第一次寫博客文章.跟筆記不一樣,總是改改改.大家見諒.