c - __security_init_cookie 和 PI

标签 c buffer-overflow

<分区>

我在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 位值。

关于c - __security_init_cookie 和 PI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942759/

相关文章:

c - GetSaveFileName()如何更新 "File name:"控件中的文件扩展名?

c - 是否存在 strcmp() 返回 -1 0 和 1 以外的值的编译器和库?

C 关于不同数据类型的指针

c - 从 C 中的多个线程接收值

c - x86_64 上的缓冲区溢出 - 回到 libc 攻击 (linux)

c - 将结构参数的名称作为参数发送

c - 禁用安全功能使 Linux 容易受到缓冲区溢出的影响

c - 缓冲区溢出 - 无法覆盖返回地址

c++ - 数组溢出(为什么会这样?)

c - 缓冲区溢出;避免溢出攻击