当前位置: 首页 > news >正文

Canary

定义:

Canary是一种用以防护栈溢出的保护机制。

原理:

是在一个函数的入口处,先从fs/gs寄存器中取出一个4字节(eax,四字节通常是32位的文件)或者8字节(rax,通常是64位的文件)的值存到栈上,当函数结束是会检查这个栈上的值是否和存进去的值相同。

通常在pwn题写exp是用的字符a,这样存储进缓冲区,将会覆盖原始的canary的值

当canary被覆盖后,也就是原应为canary的位置被字符a覆盖如此就会导致函数结束时会识别到canary被改变,如此就会触发_Stack_chk_fail函数,程序就会直接退出并报错。

绕过思路【核心:泄露canary】

1.格式化字符串泄露canary

通过格式化字符串去读取缓冲区的canary的值

2.canary爆破(针对有fork函数的程序)

fork函数会将此前的进程复制出一个子进程,在子进程执行之前,其状态等完全与父进程一模一样。也就是自我复制,这样每一次复制出的子进程的程序的内存布局一模一样,这也就构成canary的值一模一样。那我们就逐位爆破,如果程序崩了就说明这一位不对,如果正常进行并进行到了下一步就说明此位正确,如此循环直到爆出canary为止。

3.Stack smashing(故意触发canary)

这个并非是泄露得到canary,而是通过canary的错误,根据其报错信息去打印出任意地址的值(还未了解)

4.劫持_Stack_chk_fail

canary覆盖就会触发_Stack_chk_fail函数,我们可以利用其他漏洞来修改got表中的_Stack_chk_fail函数的地址,然后canary被覆盖去故意触发这个函数,但是该函数已经被改变了地址,那么就会去执行我们想要这个程序去执行的函数(eg.system())

格式化字符串(简单了解)【canary泄露常用方法】

通常在c语言中采用printf()函数去输出格式化的字符。在这个函数的学习中我们也了解到判断字符串结束的依据是\x00。那么当我们把需要输入的内容与canary连起来,那么打印的时候就能把canary一起打印出来。!!注意:canary的最后一位一定是\x00(用于防止被连带输出),那么修改的时候也要把canary的最后一位也修改。(结合gdb设断点,去查看canary的值,然后写入exp中)

相关文章:

  • 小程序API —— 52 小程序界面交互 - 模态对话框 - 消息对话框
  • 15 文件操作
  • 【初学者】解释器和脚本各是什么?有什么区别与联系?
  • Agent系列——Agent框架调研
  • 再学:函数可见性、特殊函数、修饰符
  • Python IP解析器 ip2region使用
  • Hessian矩阵详解与应用
  • VBA常见的知识都有哪些,让AI编写的VBA经常 报错,所以VBA的基础还是要学习的
  • Java 代理模式详解
  • 嵌入式GPRS协议面试题及参考答案
  • 自动驾驶背后的数学:特征提取中的线性变换与非线性激活
  • GenICam GenTL 标准 ver1.5(1)GenICam简介与框架
  • 设计模式(创建型)-抽象工厂模式
  • 每日一题:动态规划
  • AI自动生成数据
  • idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题
  • 【算法】力扣 713题:乘积小于 K 的子数组之深入思考
  • E902基于bash与VCS的仿真环境建立
  • 1~2 课程简介+ESP32-IDF环境搭建、存储结构、启动流程(虚拟机Linux环境下)
  • 【C语言】:学生管理系统(多文件版)
  • 首批18位!苏联籍抗日航空英烈信息更新
  • 轿车追尾半挂车致3死1伤,事故调查报告:司机过分依赖巡航系统
  • 解读|降准叠加政策利率、公积金贷款利率、结构性政策工具利率全线下调,影响有多大?
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 印度袭击巴基斯坦已致至少3人死亡
  • 涉个人信息收集使用问题,15款App和16款SDK被通报