執行shellcode的幾種方式

首先寫出彙編成功彈出計算器

#pragma comment(linker,"/section:.data,RWE")	//data段可讀寫

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")	//不顯示窗口

#pragma comment(linker,"/INCREMENTAL:NO")	//指定非增量編譯
#include "windows.h"
void main()
{
	__asm{
	  sub esp,0x454
	  xor ebx,ebx
	  push ebx
	  mov eax,0x6578652e
	  push eax
	  mov eax,0x636c6163
	  push eax
	  mov eax,esp
	  push 5
	  push eax
	  mov eax,0x74f0dab0
	  call eax
	  mov esp,0x450
	  
   }
 }

下面這兩條語句時和call dword ptr [WinExec]功能相同,可以利用這條語句找出自己機子上WinExec地址,然後將0x74f0dab0替換成自己機子上的地址

 mov eax,0x74f0dab0
 call eax

提取彙編的機器碼

unsigned char shellcode[]="\x81\xEC\x54\x04\x00\x00\x33\xDB\x53\xB8\x2E\x65\x78\x65\x50"
"\xB8\x63\x61\x6C\x63\x50\x8B\xC4\x6A\x05\x50"
"\xB8\xB0\xDA\xF0\x74\xFF\xD0"
"\xBC\x50\x04\x00\x00";

接下來就是如何執行shellcode了

0x01

將shellcode硬改成函數名,然後shellcode的內容相當於函數體

void Run1()
{
	((void(*)(void))&shellcode)();
}

0x02

取shellcode的偏移地址,然後到shellcode處執行

//第2種方法
void Run2()
{
	__asm{
		lea eax,shellcode
		jmp eax
	}
}

0x03

和0x02方法相同,寫法不一樣

//第3種方法

void Run3()
{

	__asm{
		mov eax,offset shellcode
		jmp eax
	}
}

0x04

用emit在當前位置直接插入數據(實際上是指令),硬編碼執行

//第四種方法
void Run4()
{

	__asm{
		mov eax,offset shellcode
		_emit 0xff;	
		_emit 0xe0;
	}

}
調試
#pragma comment(linker,"/section:.data,RWE")	//data段可讀寫

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")	//不顯示窗口

#pragma comment(linker,"/INCREMENTAL:NO")	//指定非增量編譯
#include "windows.h"
unsigned char shellcode[]="\x81\xEC\x54\x04\x00\x00\x33\xDB\x53\xB8\x2E\x65\x78\x65\x50"
"\xB8\x63\x61\x6C\x63\x50\x8B\xC4\x6A\x05\x50"
"\xB8\xB0\xDA\xF0\x74\xFF\xD0"
"\xBC\x50\x04\x00\x00";


//第一種方法
void Run1()
{
	((void(*)(void))&shellcode)();
}

//第2種方法
void Run2()
{
	__asm{
		lea eax,shellcode
		jmp eax
	}
}

//第3種方法

void Run3()
{

	__asm{
		mov eax,offset shellcode
		jmp eax
	}
}

//第四種方法
void Run4()
{

	__asm{
		mov eax,offset shellcode
		_emit 0xff;	//用emigt就是在當前位置直接插入數據(實際上是指令),硬編碼執行
		_emit 0xe0;
	}

}

void main()
{

/*	
	__asm{
	  sub esp,0x454
	  xor ebx,ebx
	  push ebx
	  mov eax,0x6578652e
	  push eax
	  mov eax,0x636c6163
	  push eax
	  mov eax,esp
	  push 5
	  push eax
	  mov eax,0x74f0dab0
	  call eax
	  mov esp,0x450
	  
   }
   */
	
	Run1();
}

在這裏插入圖片描述
其他三種方法我都調試了都可以彈出計算器

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