WEB开发网
开发学院网络安全黑客技术 破坏力依然不可小视 缓冲区溢出攻防 阅读

破坏力依然不可小视 缓冲区溢出攻防

 2006-11-07 20:09:59 来源:WEB开发网   
核心提示: 一般情况下,静态存储区和堆上的缓冲区溢出漏洞不大可能被攻击者利用,破坏力依然不可小视 缓冲区溢出攻防(2),而栈上的漏洞则具有极大的危险性,所以我们的讲解也以栈上的缓冲区溢出为例,并且GetComputerName也没有对缓冲区的长度做任何检查,这样,攻击原理要进行攻击,先得找到靶子

一般情况下,静态存储区和堆上的缓冲区溢出漏洞不大可能被攻击者利用。而栈上的漏洞则具有极大的危险性,所以我们的讲解也以栈上的缓冲区溢出为例。

攻击原理

要进行攻击,先得找到靶子。所以我就准备了一个叫做“victim”的程序作为被攻击对象,它在逻辑上等价于下面的代码:

void GetComputerName(SOCKET sck, LPSTR szComputer)
{
  char szBuf[512];
  recv(sck, szBuf, sizeof(szBuf), 0);
  LPSTR szFileName = szBuf;
  while((*szFileName) == '''')
   szFileName++;
  while((*szFileName) != '''' && (*szFileName) != '''')
  {
   *szComputer = *szFileName;
   szComputer++;
   szFileName++;
  }
  *szComputer = '''';
}
void ShowComputerName(SOCKET sck)
{
  char szComputer[16];
  GetComputerName(sck, szComputer);
  // mov ecx,dword ptr [esp+4]
  // sub esp,10h; ———②
  // lea eax,[esp]
  // push eax
  // push ecx
  // call GetComputerName (401000h)
  printf(szComputer);
  // lea edx,[esp]
  // push edx
  // call printf (401103h)
}
  // add esp,14h
  // ret 4; ———③
int __cdecl main(int argc, char* argv[])
{
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2), &wsa);
  struct sockaddr_in saServer;
  saServer.sin_family = AF_INET;
  saServer.sin_port = 0xA05B; //htons(23456)
  saServer.sin_addr.s_addr=ADDR_ANY;
  SOCKET sckListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  bind(sckListen, (sockaddr *)&saServer, sizeof(saServer));
  listen(sckListen, 2);
  SOCKET sckClient = accept(sckListen, NULL, NULL);// ———①
  ShowComputerName(sckClient);
  closesocket(sckClient);
  closesocket(sckListen);
  WSACleanup();
  return 0;
}

victim程序的本意是从网络上接收一个UNC(Universal Naming Convention)形式的文件名,然后从中分离出机器名并打印在屏幕上。由于正常情况下,机器名最多只有16个字节,所以ShowComputerName函数也只给szComputer分配了16个字节长的缓冲区,并且GetComputerName也没有对缓冲区的长度做任何检查。这样,ShowComputerName中就出现了一个缓冲区溢出漏洞。

上一页  1 2 3 4 5 6 7  下一页

Tags:破坏力 依然 不可

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接