栈Cookie,也叫安全Cookie。我们先来看一看栈Cookie的实现机制,使用的程序为1.2节中的example_2,重点在函数get_print()部分。还记得在1.2节中我们为了演示栈溢出,去掉了编译设置中的“缓冲区安全检查(GS)”选项,我们先看看未启用该选项时的get_print()函数代码: 
 
图78 未启用GS的get_print()函数代码

然后,启用该选项,看启用该选项之后的get_print()函数代码: 
 
图79 启用GS的get_print()函数代码

函数开头部分和结尾部分多了上面标注的几行代码,结尾还多了一个函数调用。先看看开头多出来的三行代码:

/*****************************************************************************/
MOV     EAX,DWORD PTR DS:[416000]
XOR     EAX,EBP
MOV DWORD PTR SS:[EBP-4],EAX
/*****************************************************************************/
  • 1
  • 2
  • 3
  • 4
  • 5

这三行代码的操作是从取数据段0x416000处的值,然后与当前的EBP进行异或操作,并将结果保存到栈中EBP-4的位置,回想1.1中的图,EBP-4的位置应该就是保存的EBP上面的那个(即紧邻EBP)。也就是说,这段代码往保存的EBP和局部变量区中间插入了一个值,现在栈变成了这个样子: 
 
图80 加Cookie之后的栈

接下来看结尾多出来的三行代码:

/*****************************************************************************/
MOV     ECX,DWORD PTR SS:[EBP-4]
XOR     ECX,EBP
CALL    example_.00411014
/*****************************************************************************/
  • 1
  • 2
  • 3
  • 4
  • 5

操作是将保存的Cookie值取处到ECX,然后再与当前EBP异或,然后调用example_.00411014函数。这是做什么呢?EBP是没有变化的,因此,若保存的Cookie值也没有变化,则与EBP异或将为原值(即从DS:[416000]取出来的值)。所以,example_.00411014应该是一个检查Cookie是否发生变化的函数,通过ECX的值来判断Cookie值是否被修改,从而做一些操作。

究竟是做什么操作,我们不再往下跟,但从1.2节中程序的表现来看,应该是引发了一个异常。 
这就是Cookie的工作原理了,在栈上的局部变量区和保存的返回地址(EIP)之间保存一个值,如果发生了栈溢出,则该值会被修改,从而验证不通过,引发栈溢出异常。这个Cookie是通过保存于数据段中的一个值与EBP异或得到的。

下面,我们在开启了GS时的栈中看一看该Cookie值(输入10个A,不超过缓冲区大小): 
 
图81 Cookie值

这就是位于EBP和局部变量之间的Cookie值。

我们重启程序再来看一看: 
 
图82 Cookie值

它的值变了!这说明DS:[416000]处的值是一个随机值,每次运行程序都不同。这样,使得Cookie值难以预测。但好消息是,它的位置是固定的。因此,Cookie的作用相当明确,就是保护下面的返回地址不被修改。

启用了栈Cookie之后,会进行Cookie值的检查,因此,绕过的方法之一,就是绕过检查的步骤。这种方法实际上我们前面已经用到了,由于栈Cookie检查在函数最后,因此提前引起一次异常,利用SEH就可以绕过Cookie的检查。当然,依据具体的程序,还有很多其它的方式,具体请看这篇专门讲栈Cookie的文章:Defeating the Stack Based Buffer Overflow Prevention Mechanism of Microsoft Windows 2003 Server, David Litchfield。

栈溢出笔记1.12 栈Cookie相关推荐

  1. 栈溢出笔记1.2 覆盖EIP

    1.1节中我们说到可以利用栈溢出来破坏栈中原有的内容,这一节中,我们就来看看如何争夺到返回地址(EIP),使得我们可以随意控制它的值,这样我们就可以控制程序.来看一个经典的程序: 这个程序的get_p ...

  2. 栈溢出笔记1.1 函数调用过程

    选择从栈溢出开始学习Shellcode的编写,是因为在没有保护机制(栈Cookie,ASLR,DEP,SafeSEH)的系统中使用栈溢出是一件很简单的事情.栈区随着函数调用动态变化,每个函数调用时在栈 ...

  3. 数据结构个人笔记 第12课 数组

    数据结构个人笔记 第12课 数组 数组 数组的顺序存储 多维数组查找指定元素 示范代码 矩阵(稀疏矩阵)压缩存储(三种方式) 对称矩阵 上(下)三角矩阵 稀疏矩阵 数组 一说起数组,我们的印象中数组往 ...

  4. 数据结构自学笔记二、栈

    数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...

  5. 《C Primer Plus》学习笔记—第12章

    目录 <C Primer Plus>学习笔记 第12章 存储类别.链接和内存管理 1.存储类别 1.作用域 2.链接 3.存储期 4.自动变量 1.程序hiding.c 2.没有花括号的块 ...

  6. JavaScript学习笔记(五)---cookie、Proxy、服务器、PHP语言、http协议、同步异步、事件轮循机制、ajax编写、接口

    JavaScript学习笔记(五)---cookie.Proxy.服务器.PHP语言.http协议.同步异步.事件轮循机制.ajax编写.接口 1.cookie 1.1cookie概念 1.2cook ...

  7. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  8. springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题

    springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题 参考文章: (1)springboot学习笔记:12.解决springboot打成可执行jar在 ...

  9. ElasticSearch 6.x 学习笔记:12.字段类型

    ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...

最新文章

  1. Linux下cacti的安装RedHat9,RedHat AS4
  2. gitlab合并分支后需要提交吗_阿里前端,如何基于 GitLab 进行「自动化」构建及发布...
  3. Java回调机制解析
  4. C++检查图是否为二部图的算法(附完整源码)
  5. 男科医生到底有多不正经… | 今日最佳
  6. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  7. mysql一对多增删改查_SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现...
  8. Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
  9. SQL Server 高可用性(一)AlwaysOn 技术
  10. OJ0428 二分查找F701
  11. swing 鼠标事件
  12. php 一天是多少秒,1天 等于 86400 秒?
  13. 泪目了!原河南常务副省长的艰辛求学路竟然这么感人
  14. uc浏览器电脑版翻译设置在哪 uc浏览器翻译网页教程
  15. 数据可视化笔记7 网络数据可视化
  16. windows无法找到发送到桌面快捷方式
  17. 【深度学习】深度学习模型
  18. 蓝桥杯 基础练习 分解质因数 python语言
  19. 架构设计:架构设计要平衡兼顾多方需求
  20. 《IPv6技术精要》一1.3 IPv5

热门文章

  1. java assert语句未执行_Java陷阱之assert关键字
  2. linux teaming状态命令,Linux 网卡Teaming
  3. union共用体(联合体)、宏定义、枚举
  4. 搜索关键字字符串NSSCanner:scanString()详解
  5. 结束十年科学争论,张辰宇团队阐明食物miRNA被胃吸收的分子机制,miRNA跨界调控再添力证...
  6. Record of circos usage
  7. 2.2基本算法之递归和自调用函数_7592 求最大公约数问题
  8. 08产品经理要明白的人性思维-团队管理篇
  9. PHPMailer目录和命名空间没有错,但是始终class not found,的原因和解决方法
  10. IM即时通讯结合mui 环信