浅析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值是否能和固定值匹配上决定是否栈溢出
有没有绕过的可能?
页:
[1]