学习编写Metasploit的exploit模块

来源:互联网 发布:武汉网络与新媒体本科 编辑:程序博客网 时间:2024/06/06 02:11

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

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

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

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

#include<windows.h>#include<stdio.h>#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安全书上找到的一种方法,在查找地址的时候比较好用,下面是一些机器码及对应的指令


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

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

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

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

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

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

0 0
原创粉丝点击