栈溢出笔记1.12 栈Cookie
栈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.2 覆盖EIP
1.1节中我们说到可以利用栈溢出来破坏栈中原有的内容,这一节中,我们就来看看如何争夺到返回地址(EIP),使得我们可以随意控制它的值,这样我们就可以控制程序.来看一个经典的程序: 这个程序的get_p ...
- 栈溢出笔记1.1 函数调用过程
选择从栈溢出开始学习Shellcode的编写,是因为在没有保护机制(栈Cookie,ASLR,DEP,SafeSEH)的系统中使用栈溢出是一件很简单的事情.栈区随着函数调用动态变化,每个函数调用时在栈 ...
- 数据结构个人笔记 第12课 数组
数据结构个人笔记 第12课 数组 数组 数组的顺序存储 多维数组查找指定元素 示范代码 矩阵(稀疏矩阵)压缩存储(三种方式) 对称矩阵 上(下)三角矩阵 稀疏矩阵 数组 一说起数组,我们的印象中数组往 ...
- 数据结构自学笔记二、栈
数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...
- 《C Primer Plus》学习笔记—第12章
目录 <C Primer Plus>学习笔记 第12章 存储类别.链接和内存管理 1.存储类别 1.作用域 2.链接 3.存储期 4.自动变量 1.程序hiding.c 2.没有花括号的块 ...
- JavaScript学习笔记(五)---cookie、Proxy、服务器、PHP语言、http协议、同步异步、事件轮循机制、ajax编写、接口
JavaScript学习笔记(五)---cookie.Proxy.服务器.PHP语言.http协议.同步异步.事件轮循机制.ajax编写.接口 1.cookie 1.1cookie概念 1.2cook ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题
springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题 参考文章: (1)springboot学习笔记:12.解决springboot打成可执行jar在 ...
- ElasticSearch 6.x 学习笔记:12.字段类型
ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...
最新文章
- Linux下cacti的安装RedHat9,RedHat AS4
- gitlab合并分支后需要提交吗_阿里前端,如何基于 GitLab 进行「自动化」构建及发布...
- Java回调机制解析
- C++检查图是否为二部图的算法(附完整源码)
- 男科医生到底有多不正经… | 今日最佳
- mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
- mysql一对多增删改查_SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现...
- Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
- SQL Server 高可用性(一)AlwaysOn 技术
- OJ0428 二分查找F701
- swing 鼠标事件
- php 一天是多少秒,1天 等于 86400 秒?
- 泪目了!原河南常务副省长的艰辛求学路竟然这么感人
- uc浏览器电脑版翻译设置在哪 uc浏览器翻译网页教程
- 数据可视化笔记7 网络数据可视化
- windows无法找到发送到桌面快捷方式
- 【深度学习】深度学习模型
- 蓝桥杯 基础练习 分解质因数 python语言
- 架构设计:架构设计要平衡兼顾多方需求
- 《IPv6技术精要》一1.3 IPv5
热门文章
- java assert语句未执行_Java陷阱之assert关键字
- linux teaming状态命令,Linux 网卡Teaming
- union共用体(联合体)、宏定义、枚举
- 搜索关键字字符串NSSCanner:scanString()详解
- 结束十年科学争论,张辰宇团队阐明食物miRNA被胃吸收的分子机制,miRNA跨界调控再添力证...
- Record of circos usage
- 2.2基本算法之递归和自调用函数_7592 求最大公约数问题
- 08产品经理要明白的人性思维-团队管理篇
- PHPMailer目录和命名空间没有错,但是始终class not found,的原因和解决方法
- IM即时通讯结合mui 环信