爲了將 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安全:軟件漏洞分析技術》