緩衝區溢位漏洞例項 開啟記事本

2022-08-03 14:03:16 字數 3220 閱讀 1224

實驗目標:使用vc++ 6.0編寫shellcode.cpp,用memcpy函式構造緩衝區溢位;並構造shellcode陣列,陣列的內容為覆蓋掉返回位址eip後,去開啟notepad.exe。

1.首先完成主函式的編寫:

void test()

void main()

主函式只呼叫test()函式,test()函式用memcpy函式造成緩衝區溢位,即大資料往小空間上拷貝。接下來編寫shellcode,只要shellcode的大小超過10,返回位址eip就會被覆蓋掉,轉向攻擊**,也就是開啟notepad.exe。

2.編寫shellcode:

shellcode是指能完成特殊任務的自包含的二進位制**,根據不同的任務可能是發出一條系統呼叫或建立乙個高許可權的shell,shellcode因此而得名。

在本次實驗中,shellcode的任務是開啟noteped.exe。所以需要利用ollyice工具來編寫構造二進位制**:

接下來以二進位制的形式複製該段**:

替換成十六進製制的形式,構成shellcode陣列:

char shellcode = ;
然後編譯程式,執行後會報錯,需要使用ollyice進行除錯:

現在情況就是發生了溢位,沒有控制好溢位後的函式返回位址,讓其進入了乙個不能讀寫的位址上去執行,所以報錯。

char shellcode = ;
繼續除錯,觀察堆疊區情況,返回位址為0x90909090,需要改寫該位址才能讓程式進入shellcode區執行。

char shellcode = ;
執行:

如果本機報錯,可繼續用上面的方法進行除錯。

3.通用性改進:

這樣編寫的exe只能在該系統上執行,如果換台機器,堆疊區不一定是0012ff34後布置攻擊**。為了增強通用性,就是我們要解決的第乙個問題,0012ff34不能硬編碼寫死。

用ollyice工具除錯,跳轉到0012ff34,觀察暫存器區,函式返回前後esp指標的情況,如圖所示:

觀察後發現函式呼叫返回後棧頂指標的內容恰好為0012ff34,所以如果想進入到該位址執行,最後是用一條指令替代硬編碼位址,jmp esp指令可以解決該問題。jmp esp指令對應的二進位製碼為ffe4,為了程式通用性,最好在系統必要的動態鏈結庫中去找(如kernel32),點選ollyice上方的m圖示進入記憶體區域,在kernel32.dll查詢ffe4:

char shellcode = ;
這樣改寫後,如果均為xp操作,該exe均能開啟notepad。

如果是不同版本的作業系統,程式的通用性還需要進一步改進,主要問題在於還有其他的硬編碼位址需要動態獲取。shellcode區域裡的0x7c8623ad為winexec在xp下的函式位址,0x7c81cafa為exitprocess的函式位址,並且0x7ffa4512位址在高版本作業系統下也不一定對應ffe4這一條指令。

為了解決這個問題,可以利用loadlibrary和getprocaddress函式進行聯合呼叫,獲取api函式位址,然後把該位址反填回shellcode。

dword a1 = (dword)getprocaddress(loadlibrary("kernel32.dll"),"winexec");

dword a2 = (dword)getprocaddress(loadlibrary("kernel32.dll"),"exitprocess");

*(dword*)(shellcode+49) = a1; /*根據自己的實際情況填寫*/

*(dword*)(shellcode+58) = a2;

dowrd base = 0x00400000;

while ( 1 )

*( dword *)&shellcode[16] = base;

三個硬編碼位址處理後,程式就可以在多個版本作業系統上正常執行。

win10執行結果(注意防毒軟體會殺掉):

完整**:

#include char shellcode = ;

void test()

void main()

*( dword *)&shellcode[16] = base;

dword a1 = (dword)getprocaddress(loadlibrary("kernel32.dll"),"winexec");

dword a2 = (dword)getprocaddress(loadlibrary("kernel32.dll"),"exitprocess");

*(dword*)(shellcode+49) = a1; /*根據自己的實際情況填寫*//*winexec函式位址對應的位置*/

*(dword*)(shellcode+58) = a2; /*exitprocess函式位址對應的位置*/

test();

}

緩衝區溢位漏洞簡介

緩衝區溢位是一種高階的攻擊手段,通過對緩衝區寫超長度內容從而造成溢位。破壞程式堆疊使程式執行其他命令,從而達到製造root許可權的目的,不過只有將溢位送到能夠以root許可權執行命令的區域才能見效果,哈哈哈.緩衝區利用程式將能執行的指令放在了能執行root許可權的記憶體中,從而一旦執行這些指令,我們...

緩衝區溢位漏洞實驗

根據實驗指導輸入命令安裝一些用於編譯 32 位 c 程式的軟體包 關閉位址空間隨機化功能 設定 zsh 程式 輸入命令 linux32 進入32位linux環境 在 tmp 目錄下新建乙個 stack.c 檔案,編輯 編譯該程式,並設定 set uid 在 tmp 目錄下新建乙個 exploit.c...

20155216 緩衝區溢位漏洞實驗

緩衝區溢位是指程式試圖向緩衝區寫入超出預分配固定長度資料的情況。這一漏洞可以被惡意使用者利用來改變程式的流控制,甚至執行 的任意片段。這一漏洞的出現是由於資料緩衝器和返回位址的暫時關閉,溢位會引起返回位址被重寫。關閉位址空間隨機化隨機堆 heap 和棧 stack 的初始位址的功能。1 輸入命令安裝...