.text:00411500 ; int __cdecl wmainCRTStartup()
.text:00411500 _wmainCRTStartup proc near              ; CODE XREF: startj
.text:00411500                 mov     edi, edi
.text:00411502                 push    ebp
.text:00411503                 mov     ebp, esp
.text:00411505                 call    j____security_init_cookie
.text:0041150A                 call    __tmainCRTStartup
.text:0041150F                 pop     ebp
.text:00411510                 retn
.text:00411510 _wmainCRTStartup endp

__tmainCRTStartup前调用___security_init_cookie进行全局___security_cookie初始化,___security_cookie开始时固定为0BB40E64Eh:

.data:00417014 ___security_cookie dd 0BB40E64Eh

___security_init_cookie负责___security_cookie初始化工作,首先将___security_cookie与0BB40E64Eh比较,相同则表示未初始化过,跳入初始化代码loc_411D01,否则向下执行。将___security_cookie和0FFFF0000h进行与操作,高4字节为0则跳入初始化代码loc_411D01,否则保存___security_cookie到ecx。

初始化代码中,首先取时间,分别与进程ID,线程ID,TickCount,性能计数器等异或,保证随机性,结果存入___security_cookie。到此全局的___security_cookie初始化完毕,并且初始化后在进程中这个值不再变化。

使用/GS选项编译,或使用了Windows SEH的代码,都会在CRT中加入 ___security_init_cookie。在受保护的函数中:

.text:00413200 var_4           = dword ptr -4
……
.text:0041321E                 mov     eax, ___security_cookie
.text:00413223                 xor     eax, ebp
.text:00413225                 mov     [ebp+var_4], eax

首先取 ___security_cookie与ebp异或存入eax,将eax值放到栈上ebp-4位置。与ebp异或保证了栈上cookie值不可预测。栈上的cookie是放在ebp&返回地址与本地变量之间,这样可以保护ebp&返回地址及以上地址空间不被覆写。

但保护不了本地变量,微软没有实现本地变量重排:

0106321E  mov         eax,dword ptr [___security_cookie (1067014h)]  
01063223  xor         eax,ebp  
01063225  mov         dword ptr [ebp-4],eax

int a = 10;
01063228  mov         dword ptr [ebp-0Ch],0Ah

int b = 2;
0106322F  mov         dword ptr [ebp-18h],2

char str[16];
printf("%p\n", str);
01063236  mov         esi,esp  
01063238  lea         eax,[ebp-30h]  
0106323B  push        eax  
0106323C  push        offset string "%s\n" (10657A0h)  
01063241  call        dword ptr [__imp__printf (10682ACh)]

受保护的函数返回前:

.text:00413283                 mov     ecx, [ebp+var_4]
.text:00413286                 xor     ecx, ebp        ; cookie
.text:00413288                 call    j_@__security_check_cookie@4 ;__security_check_cookie(x)

从栈上取出cookie与ebp异或,将还原后___security_cookie存入ecx,然后调用__security_check_cookie检查。

.text:00412A00 @__security_check_cookie@4 proc near    ; CODE XREF: __security_check_cookie(x)j
.text:00412A00
.text:00412A00 cookie          = dword ptr -4
.text:00412A00
.text:00412A00                 cmp     ecx, ___security_cookie
.text:00412A06                 jnz     short failure
.text:00412A08                 rep retn
.text:00412A0A ; ---------------------------------------------------------------------------
.text:00412A0A
.text:00412A0A failure:                                ; CODE XREF: __security_check_cookie(x)+6j
.text:00412A0A                 jmp     j____report_gsfailure
.text:00412A0A @__security_check_cookie@4 endp

__security_check_cookie函数将全局___security_cookie与ecx中存放的还原出的___security_cookie比较,若不同则表示发生了溢出,调用____report_gsfailure执行异常处理。

下面分析一下StackCookie绕过的可行性,有利条件:

1、__security_cookie可以从内存读到。
2、ebp与esp地址相邻,通过泄漏esp可猜测ebp。

不利条件:

1、程序检测到溢出,____report_gsfailure崩溃退出。
2、栈布局随机化,重新运行程序,ebp变化即上次泄漏的esp失效。

Hook掉____report_gsfailure等异常处理函数可以轻松绕过stack cookie,但已经能在目标系统执行代码,再写这个溢出就没什么意义了。

因为___security_cookie+ASLR的存在,Windows的栈溢出漏洞已经很难利用。覆盖SEH链这类方法虽然可行,但并不是获取了cookie值,所以不能算作对cookie机制的破解。

下面引用tombkeeper在微博上的一段话:

内存破坏类漏洞攻防对抗的发展形势大概会是这样:目前所有已知攻击方式在未来几年内被逐渐阻止或充分缓解,新的攻击方式将不仅难以被设计出来,而且实现过程也很复杂——如果没有相关研究作为基础,即使捕捉到野外样本,分析者甚至可能难以理解样本是如何被制作出来的。

___security_cookie机制的更多相关文章

  1. ___security_cookie机制,防止栈溢出

    从研究底层和汇编以来,已经多次接触到“栈溢出”这个名词了. 这次在汇编码中看到了个不明就里的 ___security_cookie ,查了下,原来是编译器的安全检查机制.转载一篇文章: 首先,secu ...

  2. security cookie 机制(2)--- 初始化___security_cookie

    在 cookie 检查中,必定先要取出初始的 cookie 值: 0011392E A1 14 70 11 00       mov         eax,dword ptr [___securit ...

  3. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  4. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  5. 谈谈DOMContentLoaded:Javascript中的domReady引入机制

    一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...

  6. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  7. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  8. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  9. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

随机推荐

  1. MongoDB 教程(五):连接、新建数据库、删除数据库

    连接 启动 MongoDB 服务 只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可. 执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接 ...

  2. python中RabbitMQ的使用(远程过程调用RPC)

    在RabbitMQ消息队列中,往往接收者.发送者不止是一个身份.例如接接收者收到消息并且需要返回给发送者. 此时接收者.发送者的身份不再固定! 我们来模拟该情形: 假设有客户端client,服务端se ...

  3. Nodejs--util模块

    util.inspect util.inspect是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出. 它至少接受一个参数 object,即要转换的对象. util.inspect(obje ...

  4. random模块,time模块,os模块,sys模块

    一.random模块 >>> import random #随机小数 >>> random.random() # 大于0且小于1之间的小数 0.7664338663 ...

  5. 牛客网第一场E题 Removal

    链接:https://www.nowcoder.com/acm/contest/139/E 来源:牛客网 Bobo has a sequence of integers s1, s2, ..., sn ...

  6. Linux tar压缩命令 排除某个目录 (根据man tar 总结)

    一般直接用tar命令打包很简单,直接使用 tar -zcvf test.tar.gz test 即可. 在很多时候,我们要对某一个目录打包,而这个目录下有几十个子目录和子文件,我们需要在打包的时候排除 ...

  7. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程

    一.服务端请求伪造漏洞 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助 ...

  8. Eclipse错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    该报错是由于缺少servlet-api.jar造成的,将servlet-api.jar复制到项目下的WEB-INF/lib目录下即可 servlet-api.jar在tomcat的lib目录下有,可以 ...

  9. am335x system upgrade uboot nand boot(三)

    在uboot 下初始化nand,一般需要做如下工作: 第一: 配置默认从NAND boot Index: include/configs/am335x_evm.h=================== ...

  10. TCP_NODELAY算法使用事项

    当有一个TCP数据段不足MSS,比如要发送700Byte数据,MSS为1460Byte的情况.nagle算法会延迟这个数据段的发送,等待,直到有足够的数据填充成一个完整数据段.也许有人会问,这有什么影 ...