为了将 GS 对性能的影响降到最小,并不是所有的函数都会被保护,所以我们就可以利用其中一些未被保护的函数绕过 GS 的保护。
那我们在之前《《Windows安全机制》之GS机制》举得例子:SmallBuffer()
void SmallBuffer()
{
char BufferData[4] = "";
int num = 2;
}
int main()
{
BigBuffer();
SmallBuffer();
getchar();
return 0;
}
使用 IDA 对可执行程序进行反汇编可以看到程序在执行完函数返回时,没有进行任何 Security Cookie的验证操作。
我们修改一下代码:在SmallBuffer进行拷贝字符串,拷贝进来的字符串明显大于4字节。
void SmallBuffer(char * str)
{
char BufferData[4] = "";
strcpy(BufferData, str);
int num = 2;
}
int main()
{
char* str = "yeah,the fuction is without GS";
SmallBuffer(str);
getchar();
return 0;
}
我们使用 VS2015 调试器进行调试,调试器会报告内存访问冲突,此时返回地址已经被覆盖。
Ebp、返回地址被覆盖。
如何利用
可以在未被GS保护的函数中,进行大缓冲区拷贝小缓冲区,利用换缓冲区溢出写入ShellCode实现恶意攻击。
参考资料:
《0day安全:软件漏洞分析技术》