- UID
- 2
- 精华
- 积分
- 7750
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
老话题了,前几天遇到了,这里便总结一下,没什么新意~~,(不是从网上摘的,保证原创)
定义在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
- 在用到栈变量的函数中,函数序言部分:
- 013C7210 push ebp
- 013C7211 mov ebp,esp
- 013C7213 sub esp,10Ch
- 013C7219 mov eax,dword ptr [___security_cookie (141E078h)]
- 013C721E xor eax,ebp
- 013C7220 mov dword ptr [ebp-4],eax
- 函数结语部分:
- 013C723F mov ecx,dword ptr [ebp-4]
- 013C7242 xor ecx,ebp
- 013C7244 call @ILT+370(@__security_check_cookie@4) (13C5177h)
- 013C7249 mov esp,ebp
- 013C724B pop ebp
- 013C724C ret
复制代码
栈桢:
_________________
........
_________________
cookie=ebp^eax 预存的溢出检测数据
_________________
10Ch
_________________
ebp
_________________
返回地址
_________________
一般溢出的范围是一段地址,而非单个DWORD,因此溢出到返回地址的位置时,cookie也会被改写,所以这里__security_check_cookie@4通过检测cookie值是否能和固定值匹配上决定是否栈溢出
|
|