学习编写Metasploit的exploit模块

表示终于是成功了,倒腾了一个星期了,周六在大神的指导下,栈溢出成功了!

在WinXP Sp3上写了一个栈溢出的漏洞,然后再BT5上写了个exploit模块,使之栈溢出,原理其实很简单,开一个数组然后赋值给该数组覆盖该函数的返回地址。简单介绍下如何获取返回地址,以及应当填充的字符的个数吧。

首先是返回地址Ret,即应该将漏洞代码的返回地址覆盖成的地址,Windows上一般采用的方法就是去调用一些系统进程的jmp/call esp指令(该地址是固定的,但Win7后加了地址随机化),然后再由该指令跳到shellcode,具体原理就不解释了,网上有好多说的很清楚的。

1.获取jmp/call esp指令的地址:

#include
#include
#define DLL_NAME "kernel32.dll"
// 一般加载的进程像user32.dll,kernel32.dll  
int main(){
	BYTE *ptr ;
	int position, address ;
	HINSTANCE handle ;
	BOOL done_flag = FALSE ;
	handle = LoadLibrary(DLL_NAME) ;
 	if( !handle ){
		printf(" load dll error") ;
	 	exit(0) ;
	}
	ptr = (BYTE*) handle ;

	for( position = 0; !done_flag; position++ ){
		 try{
		 	  	  //机器码0xffe4对应的是jmp esp   
		 	  	  if( ptr[position] == 0xFF && ptr[position+1] == 0xE0 ){
  				  	  int address  = (int)ptr + position ;
    		   		  printf("OPCODDE found at 0x%x\n",address) ;
		 	  	  }
		 }
   		 catch(...){		  	   				     		  	  	
				        address = (int)ptr + position ;
	           			printf("END OF 0x%x\n",address) ;
				        done_flag = TRUE ;
   		 }
	}
	return 0 ;
}
这是从ODAY安全书上找到的一种方法,在查找地址的时候比较好用,下面是一些机器码及对应的指令

学习编写Metasploit的exploit模块_第1张图片

2.得到应该添加的空字符数

表示就是这个问题让我纠结了很久,最后还是因为差了八个字节,让ret处被shellcode给填充了,一直看不到shellcode执行的效果:

开始是直接把返回地址打出来,然后根据开的数组的大小计算个数,

void a(void(*b)()){
    ///
}
void b(){
    a(b) ;
}
在网上找到了这个打出地址的方法,后面大神也说这应该不会出错,而且个数也是4的整数倍,不会出现什么补齐的现象。。。希望有知道原因的赐教下。。。。。

后面还是用 ollydbg(强烈推荐使用)检测时候才发现这个问题,

第一次成功的经验,希望能对初学者有些帮助。。。。

你可能感兴趣的:(学习编写Metasploit的exploit模块)