2020年5月13日 星期三

[轉載] ___security_cookie機制,防止棧溢出

原文

從研究底層和彙編以來,已經多次接觸到“棧溢出”這個名詞了。

這次在彙編碼中看到了個不明就裡的 ___security_cookie ,查了下,原來是編譯器的安全檢查機制。轉載一篇文章:

首先,security cookie並不是windows系統自帶的保護機制,並不是說一個確實存在溢出漏洞的
程序,放到帶security cookie保護的環境中,就不能正常溢出了。
那麼,到底是什麼是security cookie呢?
我覺得從廣義上講,它應該是一種保護棧的機制,提供這種保護的,是程序本身,編譯進程序本身的代碼提供的,而不是系統中某個運行在黑暗角落中的線程。
所以,既然是程序自身就帶上的,為了不給程序員帶來額外的負擔,這份工作就交給編譯器來完成了。
vc6.0的cl.exe是不帶這個功能的,只有vc.net以後面版本的cl.exe才帶這個功能,就所謂的/GS選項。
即用vc.net的cl編譯器時,/GS選項默認就打開了。
現在,我們知道了這個機制的提供方,那麼,這個機製到底是怎麼一回事呢?
熟悉函數調用及返回前後的彙編指令的人肯定很清楚,在win32平台,對於stdcall類型的函數調用,當call指令運行完畢,當前的堆棧結構基本上是這樣的: