__security_cookie 用于 Windows 10 中的函数指针

逆向工程 艾达 视窗 安全
2021-07-03 04:09:56

我对此很好奇__security_cookie,我一直在msvcp140.dll从我的 Windows 10 x64(内部版本)中看到一点

下面是一个例子:

在此处输入图片说明

请注意,间接函数调用(或qword_18009FBD0的地址取自以下.data部分:

在此处输入图片说明

然后它与以下内容进行异或运算__security_cookie

在此处输入图片说明

我认为这__security_cookie是在堆栈上用于防止缓冲区溢出的东西。所以他们必须使用一些新的安全技术。知道那是什么吗?

还有一个后续问题。我试图用 IDA 静态分析这个二进制代码,这__security_cookie使得很难看到实际调用了什么函数。例如,下面是qword_18009FBD0这样的:

在此处输入图片说明

知道如何使这些函数地址更清晰吗?

1个回答

查找对 的写入以qword_18009FBD0查看它的初始化位置。

显然,它是一个数组的一部分, __encodedKERNEL32Functions在与__security_cookie. 您可以将指向 kernel32 函数名称的指针重命名以更好地了解发生了什么:

  ;(from initialize_pointers)
  lea     rdx, aClosethreadpoo ; "CloseThreadpoolTimer"
  mov     rcx, rbx        ; hModule
  mov     cs:qword_180092498, rax
  call    cs:__imp_GetProcAddress
  xor     rax, cs:__security_cookie
  lea     rdx, aCreatethreadpo_0 ; "CreateThreadpoolWait"
  mov     rcx, rbx        ; hModule
  mov     cs:pCloseThreadpoolTimer_xored, rax ;<- variable renamed

__crtCloseThreadpoolTimer proc near 
                sub     rsp, 28h
                mov     rax, cs:pCloseThreadpoolTimer_xored
                xor     rax, cs:__security_cookie
                jz      short loc_180036A8A
                call    cs:__guard_dispatch_icall_fptr ; calls CloseThreadpoolTimer()
loc_180036A8A:  
                add     rsp, 28h
                retn
__crtCloseThreadpoolTimer endp

这种缓解措施实际上并不是新的,并且已经在VS2013 CRT 中使用,尽管形式略有不同。它可能旨在减少标准 CRT DLL 中可用 API 指针的数量,以增加利用难度。

尽管__security_cookie最常用于保护堆栈上的数据(GS 和 EH cookie),但没有什么能阻止程序员将其用作其他目的作为简单的熵源。