security cookie 機制(2)--- 初始化___security_cookie
在 cookie 檢查中,必定先要取出初始的 cookie 值:
0011392E A1 14 70 11 00 mov eax,dword ptr [___security_cookie (117014h)] 00113933 33 C5 xor eax,ebp 00113935 89 45 FC mov dword ptr [ebp-4],eax |
這個 cookie 值是屬於使用者程序的,在這裡是 helloworld.exe 映像
現在我們來看看這個 cookie 值被初始化什麼,在哪裡初始化?
0:000:x86> uf 0xb21221 helleworld!ILT+540(_wWinMainCRTStartup): |
在 helloworld 的 wWinMainCRTStrartup() 啟動例程裡,首先呼叫 __security_init_cookie()例程進行 cookie 初始化,然後跳轉到 __tmainCRTStartup() 最後流轉到使用者 wWinMain(),這些例程都是在使用者空間,屬於使用者程序的。它們是 visual c++ 編譯器為使用者程式安插的啟動例程,並且它們都是有原始碼提供,在 VC 的執行時庫例程裡可以找到原始碼。
下面我們來看看__security_init_cookie()例程是怎樣運作的,在我目錄是:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src 下的檔案 gs_support.c
#ifdef _WIN64
void __cdecl __security_init_cookie(void)
if (__security_cookie != DEFAULT_SECURITY_COOKIE
GetSystemTimeAsFileTime(&systime.ft_struct); cookie ^= GetCurrentProcessId(); QueryPerformanceCounter(&perfctr); #if defined (_WIN64)
if (cookie == DEFAULT_SECURITY_COOKIE) __security_cookie = cookie; } |
__security_cookie 在 CRT 庫裡是全域性變數,見於另一個檔案 gs_cookie.c
#ifdef _WIN64 DECLSPEC_SELECTANY UINT_PTR __security_cookie = DEFAULT_SECURITY_COOKIE; DECLSPEC_SELECTANY UINT_PTR __security_cookie_complement = ~(DEFAULT_SECURITY_COOKIE); |
CRT 庫的 __security_cookie 的值就是 DEFAULT_SECURITY_COOKIE,在 Win32 下被定義為 0xBB40E64E,在 Win64 下被定義為 0x00002B992DDFA232
但是使用者程序的 __security_cookie 值,需進行下面的設定:
- 獲得 system time
- 與 GetCurrentProcessId() 異或
- 與 GetCurrentThreadId() 異或
- 與 GetTickCount() 異或
- 與 QueryPerformanceCounter()異或
經過一系列異或使用者的 __security_cookie 值就出來,我們大概可以猜到 DEFAULT_SECURITY_COOKIE 這個值就是根據這樣算出來的,因此如果算出來結果還是等於 DEFAULT_SECURITY_COOKIE 那麼就需要加上1