注意!是纯纯纯小白!一点都没接触过,一点都不会的那种!大佬请移步

CANARY

栈溢出保护是一种缓冲区溢出攻击的缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址shellcode能够执行。

1.基础介绍

缓冲区:在计算机读取数据时, 在内存中开辟的临时存储数据的区域。

缓冲区溢出:针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁中断之际获取程序乃至系统的控制权。

计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

数据覆盖:在计算机中,因粘贴使原有数据被现有数据所占有,就称被覆盖,使原有数据消失。一旦出现数据覆盖情况是无法对数据进行恢复的,一些以为被覆盖的数据其实还存在,这种情况下是可以恢复的。

栈的返回地址

这里需要介绍一下栈的结构

每个栈帧中包含:

局部变量表

操作数栈(也可以叫表达式栈)

动态链接 (或指向运行时常量的方法引用)

动态返回地址(或方法正常退出或者异常退出的引用的定义)

一些附加信息

一个一个介绍...

局部变量表

局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型

(很明显这里面一堆名词对新手很不友好,没关系,一个一个来解释)

数组:有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。(这个学过C的都知道吧)

局部变量:在程序中只在特定过程或函数中可以访问的变量。

变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。

注意:

局部变量表中的变量只在当前方法调用中有效。在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程,当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。

由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题。
局部变量表所需的容量大小是在编译期就确定下来的,并保存在方法的Code属性的maximum local variables数据项中,在方法运行期间是不会改变局部变量表的大小的。

对象引用:编程中将函数实例化的一种方式。

在实际中,使用对象引用作函数参数要比使用对象指针作函数参数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。

returnaddress就是返回地址啦..

好了,现在局部变量表应该都知道是什么东西了,接下来说操作数栈

操作数栈

在方法执行过程中,根据字节码指令,在栈中写入数据或提取数据,即入栈push(出栈pop)

操作数栈和局部变量表在访问方式上存在着较大差异,操作数栈并非采用访问索引的方式来进行数据访问的,而是通过标准的入栈和出栈操作来完成一次数据访问。

每一个操作数栈都会拥有一个明确的栈深度用于存储数值,一个32bit的数值可以用一个单位的栈深度来存储,而2个单位的栈深度则可以保存一个64bit的数值,当然操作数栈所需的容量大小在编译期就可以被完全确定下来,并保存在方法的Code属性中。

字节码(Byte-code):是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,一种中间码,通过源码编译过来的,可读性没有源码高。

索引:数据库术语,使用索引可快速访问数据库表中的特定信息。

索引是对数据库表中一列或多列的值进行排序的一种结构。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

Code属性

这个首先要介绍一下“属性”:属性( attribute )是编程语言结构的任意特性。属性在其包含的信息和复杂性等方面变化很大,特别是当它们能确定时翻译/执行过程的时间。

例如,一个数的有效位数可以根据语言的定义确定(或者至少给出一个最小值)。属性也可以在程序执行期间才确定,如(非常数)表达式的值,或者动态分配的数据结构的位置。不同的属性变化,甚至不同语言的相同属性都可能有完全不同的联编时间。在执行之前联编的属性称作静态的( static ),而只在执行期间联编的属性是动态的( dynamic )。

用于文件,指出文件是否为只读、隐藏、准备存档(备份)、压缩或加密,以及是否应索引文件内容以便加速文件搜索的信息。

属性表里包含的属性很多很多,code属性是其中之一。

那么,code属性:使用位置方法表,含义java代码编译成的字节码指令。

动态返回地址

存放该调用方法的pc寄存器的值

一个方法的结束,有两种方式

遇到return,将返回值传递给上层方法调用者,简称正常完成出口,返回指令包括ireturn( boolean,byte,char,short,int),lreturn,freturn,dreturn,以及areturn,还有return 返回为void、实例初始化方法,类和接口的初始化方法

异常完成出口,即碰到了异常,并且没有在方法内进行处理,就会退出方法。方法在执行过程总抛出异常时的异常处理,储存在一个异常处理表,方法在发生异常时候找到处理异常的代码。

无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址,而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。

本质上,方法的退出就是当前栈帧出栈的过程,此时,需要恢复上层方法的数据区等信息,让调用者方法继续执行下去。

正常完成出口和异常完成出口的区别在于,通过异常完成出口推出的不会给它的上层调用者产生任何的返回值。

上层调用者:顾名思义,通俗点说就是能调动它的东西。

shellcode

shellcode是16进制的机器码。

在暂存器eip溢出后,插入一段在cpu执行的shellcode码,从而达到攻击目的(这个后面细讲)

总结

综上所述,就是利用缓冲区溢出,覆盖栈上的返回地址,然后干一个shellcode过去,就行了。而canary就是防止这个手段的。

那么它是怎么防护的呢

它往那一段信息里插入了cookie,如果恶意覆盖的话会把这段cookie一起覆盖掉,就会出发保护。

canary(栈溢出保护)纯新手入门(一)相关推荐

  1. RELRO (ReLocation Read-Only)保护纯新手入门(一)

    RELRO,堆栈地址随机化, 是一种用于加强对 binary 数据段的保护的技术. partial relro (部分开启,got 不可写) full relro(全部开启,got 可写) 那么这是个 ...

  2. 纯新手入门机器/深度学习自学指南(附一个月速成方案)

    原作:Masum Hasan 问耕 编译整理 量子位 出品 | 公众号 QbitAI 怎么入门机器/深度学习? 回答这个问题,最先要考虑的问题是:你有多少时间? 准备用三个月入门,和想要一个月速成,肯 ...

  3. Pytorch纯新手入门笔记

    Pytorch入门笔记(推荐配合B站up主我是土堆食用) PyTorch深度学习快速入门教程(绝对通俗易懂!)[小土堆] 视频作者:我是土堆 Pytorch入门 P1 命令行中对anaconda不同环 ...

  4. 【贪玩巴斯】大一暑假自学Linux笔记记录Day4 //纯新手入门基于ubantu

    大家好,我是巴斯,一个平平无奇的大一学生,利用暑假的日子,在家自学Linux,想着发博客来记录,欢迎大家对博客内容提出建议和交流.***B站看的黑马程序员的视频 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 今天的内 ...

  5. 适合新手入门的漏洞调试与分析—CVE-2010-3333

    这是第二次在tools发帖,为了响应管理猿的号召,也为了爱好应用程序安全新手的需要.在此,我初步研究了一下微软3333漏洞的成因,并试着定位到了样本中的shellcode,现在就对这个入门级的漏洞做个 ...

  6. 新手入门 如何快速找到Python进阶路线?

    新手入门 如何快速找到Python进阶路线?Python作为一种开放源代码的脚本编程语言,常用于开发各种程序.随着近几年人工智能的火爆,Python一度受到众多程序员的追捧,成为首选的入门编程语言.很 ...

  7. mac 删除分区 command r 选择网络_Mac使用必看基础篇,Mac快捷键大全,mac新手入门指南...

    你是Mac新手吗?你对使用Mac电脑有疑问吗?你还不知道mac有哪些快捷键吗?别着急,来看看小编给大家准备的Mac使用必看基础篇--Mac快捷键大全,对于新手用户很有帮助哦!! 一.开机相关命令快捷键 ...

  8. Python 新手入门引导

    这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学.不管你学习的出发点是兴趣驱动.拓展思维,还是工作需要.想要转行,都可以此文作为一个参考. 在这个信息爆炸 ...

  9. Python学习入门1:Python 新手入门引导

    这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学.不管你学习的出发点是兴趣驱动.拓展思维,还是工作需要.想要转行,都可以此文作为一个参考. 在这个信息爆炸 ...

  10. android 蒙版图片带拖动_黑橙修图:新手入门篇2-一句话带你认识图层蒙版

    大家好,这里是黑橙修图新手入门教程系列. 上一篇文章我么介绍了ps当中最核心的一个概念--图层.那么这篇文章带大家来了解一个与图层密切相关的概念--图层蒙版. 其实,图层蒙版也是一个类似图层的东西,只 ...

最新文章

  1. 怎么形容智能冰激凌机器人_一种人机交互型冰激凌多功能自动售卖机器人的制作方法...
  2. docker搭建harbor私有镜像库
  3. Java Web学习总结(11)JDBC
  4. python利器怎么编程-Python任务调度利器之APScheduler详解
  5. (22)通过代码修改PTE实现挂物理页
  6. P1032 字串变换(bfs)
  7. android蓝牙4.0使用方法
  8. CPU核数和线程数查找
  9. 明明的随机数冒泡排序c 语言,NOIP复赛 c++-明明的随机数(算法和原码参考)
  10. 浏览器端的九种缓存机制介绍
  11. 猜51CTO的人群结构
  12. 一张图看懂什么是运维?
  13. 大漠插件ocr多选字库_大漠ocr识别字库的生成,和使用方法
  14. 几种物流业务的凭证模板设置说明
  15. Android 视频压缩
  16. C语言实现程序的暂停
  17. Yocto中开发内核的两种方法
  18. 爬虫及数据分析--当当网
  19. QD-Mini LED好在哪?看看这些评价就知道了
  20. Matlab归一化实现

热门文章

  1. lef industries LEF 102-LC2-GR1
  2. 软件工程 -- RUB,极限编程
  3. 【UE5 多人联机教程】03-创建游戏
  4. CAS:288617-75-4 (S)-N-Fmoc-2-(7‘-octenyl)alanine
  5. 微信公众号自动登录方案
  6. 各大学2022年9月网络教育统考计算机应用基础考试复习题库
  7. linux共享内存是什么意思,linux系统监视器中的内存和共享内存分别指什么呀?
  8. 如何使用C++实现你量交策
  9. 使用 Github Action 自动部署 Hugo 博客
  10. Flutter之Dart语法(二)面向对象