元始天尊 发表于 2015-8-23 00:11:38

浅析security cookie原理

老话题了,前几天遇到了,这里便总结一下,没什么新意~~,(不是从网上摘的,保证原创)
定义在vc源码目录下secchk.c:
extern UINT_PTR __security_cookie;
void __declspec(naked) __fastcall __security_check_cookie(UINT_PTR cookie)
{
    /* x86 version written in asm to preserve all regs */
    __asm {
      cmp ecx, __security_cookie
      jne failure
      rep ret /* REP to avoid AMD branch prediction penalty */
failure:
      jmp __report_gsfailure
    }
}

编译器生成二进制机器码后,便通过某种逻辑硬性指定了__security_cookie
在用到栈变量的函数中,函数序言部分:
013C7210push      ebp
013C7211mov         ebp,esp
013C7213sub         esp,10Ch
013C7219mov         eax,dword ptr
013C721Exor         eax,ebp
013C7220mov         dword ptr ,eax

函数结语部分:
013C723Fmov         ecx,dword ptr
013C7242xor         ecx,ebp
013C7244call      @ILT+370(@__security_check_cookie@4) (13C5177h)
013C7249mov         esp,ebp
013C724Bpop         ebp
013C724Cret

栈桢:
_________________
........
_________________
cookie=ebp^eax       预存的溢出检测数据
_________________


10Ch

_________________
ebp
_________________
返回地址
_________________




一般溢出的范围是一段地址,而非单个DWORD,因此溢出到返回地址的位置时,cookie也会被改写,所以这里__security_check_cookie@4通过检测cookie值是否能和固定值匹配上决定是否栈溢出



0x01810 发表于 2015-8-24 20:51:42

有没有绕过的可能?
页: [1]
查看完整版本: 浅析security cookie原理