学习编写Metasploit的exploit模块

论坛 期权论坛 脚本     
匿名技术用户   2020-12-21 20:47   21   0

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

在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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP