__security_init_cookie 和圆周率
__security_init_cookie and PI
我在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\gs_support.c
中找到了这个函数
0xBB40E64E=3141592654=PI
- 为什么平台不是 win64 时 DEFAULT_SECURITY_COOKIE
设置为这个值?
为什么systemtime
、ProcessId
、ThreadId
、TickCount
等之间有很多异或运算
数字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
我在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\gs_support.c
中找到了这个函数0xBB40E64E=3141592654=PI
- 为什么平台不是 win64 时DEFAULT_SECURITY_COOKIE
设置为这个值?为什么
systemtime
、ProcessId
、ThreadId
、TickCount
等之间有很多异或运算数字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