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

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中)


http://www.kler.cn/a/591169.html

相关文章:

  • 堆排序:力扣215.数组中的第K个大元素
  • 使用React和google gemini api 打造一个google gemini应用
  • RustDesk自建远程桌面服务教程
  • 蓝桥杯练习day1:自除数
  • 深入理解 C 语言中的 scanf、printf
  • 《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历 问题 D: 二叉树遍历
  • 受控组件非受控组件
  • 新造车不再比拼排名,恰是曲终人散时,剩者为王
  • 【大语言模型知识】Transformer架构概述
  • LLVM学习-- 构建和安装
  • redis的典型应用 --缓存
  • 自定义捕捉与处理信号的底层逻辑
  • mkdir /path/aa/bb与mkdir -p /path/aa/bb的区别
  • 案例5_3: 6位数码管静态显示
  • Maven | 站在初学者的角度配置
  • 【写作科研化】LongWriter: Unleashing 10,000+ Word Generation From Long Context LLMs
  • Hard Disk Sentinel:您的硬盘健康“全科医生”,守护数据安全的智能管家
  • 我爱学算法之——滑动窗口攻克子数组和子串难题(上)
  • [从零开始学习JAVA] Stream流
  • HTML5 Canvas 的俄罗斯方块游戏开发实践