__security_init_cookie 和圆周率

__security_init_cookie and PI

我在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\gs_support.c

中找到了这个函数
  1. 0xBB40E64E=3141592654=PI - 为什么平台不是 win64 时 DEFAULT_SECURITY_COOKIE 设置为这个值?

  2. 为什么systemtimeProcessIdThreadIdTickCount等之间有很多异或运算

  3. 数字0x00002B992DDFA232是什么意思?

#ifdef _WIN64
#define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232
#else 
#define DEFAULT_SECURITY_COOKIE 0xBB40E64E
#endif

extern UINT_PTR __security_cookie;
extern UINT_PTR __security_cookie_complement;

typedef union {
    unsigned __int64 ft_scalar;
    FILETIME ft_struct;
} FT;
void __cdecl __security_init_cookie(void)
{
    UINT_PTR cookie;
    FT systime={0};
    LARGE_INTEGER perfctr;

    if (__security_cookie != DEFAULT_SECURITY_COOKIE
#if defined (_X86_)
        && (__security_cookie & 0xFFFF0000) != 0
#endif 
       )
    {
        __security_cookie_complement = ~__security_cookie;
        return;
    }


    GetSystemTimeAsFileTime(&systime.ft_struct);
#if defined (_WIN64)
    cookie = systime.ft_scalar;
#else 
    cookie = systime.ft_struct.dwLowDateTime;
    cookie ^= systime.ft_struct.dwHighDateTime;
#endif
    cookie ^= GetCurrentProcessId();
    cookie ^= GetCurrentThreadId();
    cookie ^= GetTickCount();
    QueryPerformanceCounter(&perfctr);
#if defined (_WIN64)
    cookie ^= perfctr.QuadPart;
#else 
    cookie ^= perfctr.LowPart;
    cookie ^= perfctr.HighPart;
#endif
#if defined (_WIN64)

    cookie &= 0x0000FFFFffffFFFFi64;
#endif

    if (cookie == DEFAULT_SECURITY_COOKIE)
    {
        cookie = DEFAULT_SECURITY_COOKIE + 1;
    }
#if defined (_X86_)
    else if ((cookie & 0xFFFF0000) == 0)
    {
        cookie |= ( (cookie|0x4711) << 16);
    }
#endif
    __security_cookie = cookie;
    __security_cookie_complement = ~cookie;
}

使用 Pi 是 "Nothing up my sleeve number" 的典型案例,在安全上下文中很常见。出于安全原因,使用 0、1 或任何较小的数字都是不好的。但是使用随机数会很可疑——这个数字是否可能被选择用作有意的后门?

不过,如果已知安全 cookie 始终为 0xBB40E64E,漏洞利用代码可能会尝试利用这一事实。随机混合其他数据会降低其可预测性,因此更难成为破坏目标。 (cookie 的目标是在堆栈上拥有调用者已知但漏洞利用代码不知道的值)。

不知道 64 位值。

0x00002B992DDFA232 是 3141592653589793241 >> 16