绕过canary原理及其利用方式

canary简介:
canary是一种用来防护栈溢出的保护机制。其原理是在一个函数的入口处,先从fs/gs寄存器中取出一个4字节(eax)或者8字节(rax)的值存到栈上,当函数结束时会检查这个栈上的值是否和存进去的值一致,若一致则正常退出,如果是栈溢出或者其他原因导致canary的值发生变化,那么程序将执行___stack_chk_fail函数,继而终止程序。
所以如果有一道题开启了canary保护,但不知道canary的值,就不能够进行ROP来劫持程序流程,那么这道题就无法解决了。

Canary绕过方式一般canary有两种利用方式
1.爆破canary
2.如果存在字符串格式化漏洞可以输出canary并利用溢出覆盖canary从而达到绕过

这里我们采用第二种利用方法:
printf 属于可变参数函数,函数调用者可任意指定参数和数量,这也是漏洞产生的原因。

printf()函数的一般形式为:
printf(“format”,输出列表)

format参考列表:
参考https://blog.csdn.net/py_1995/article/details/84031480

例题源码
在这里插入图片描述
程序提供了shell
检查下程序保护
在这里插入图片描述
开启了NX以及Canary保护
载入IDA查看流程
在这里插入图片描述
发现有格式化字符串漏洞,但是对照源码发现程序结束以后多出一步比较,所以判断此处的v6就是canary保护生成的随机参数,我们也可以在汇编代码处看出
在这里插入图片描述
因为v6的地址是esp+3Ch 而这里 mov edx,[esp+3ch]就可以知道edx里面存在的就应该是v6的值了
看到这里利用edx中获取的v6的值与large gs:14h进行 xor判断,如果不相等则 call ___stack_chk_fail 退出程序。由此可以判断出v6就是canary保护生成的随机参数。

找出canary值的思路:
根据canary特性知道canary也会进行压栈所以canary的值应该会在栈的附近,我们就可以canary赋值给edx之后进行下断,通过edx的值来得到canary的值。

把程序载入gdb进行调试
在printf处下断
在这里插入图片描述
运行程序,观察我们输入的字符在栈堆中的位置
在这里插入图片描述
尝试打印该地址内存
在这里插入图片描述
可以看到输出AAAA的偏移为5,printf打印出的应该是偏移后的下一位地址
在IDA中查看xor的地址进行下断
在这里插入图片描述
在这里插入图片描述
继续运行程序查看edx的值
在这里插入图片描述
我们查看之前printf的内存地址
在这里插入图片描述
发现edx 0x9b0cff00的偏移为15,所以可以构造当前的canary的值
在这里插入图片描述
成功的泄露出当前的canary的值,但是要注意的是每次程序初始化canary的值都是不一样的,所以我们因该写一个exp
from pwn import *
p = process(’./binary_200’)
leak_canary = ‘%15$x’
p.sendline(leak_canary)
canary = int(p.recv(),16)
print hex(canary)

泄露出了canary的值,我们可以通过gets溢出到canary处覆盖canary的值从而达到绕过canary的目的
计算第一次gets与canary的偏移
因为canary的赋值是从v6而来所以计算v5与v6的偏移即可
在这里插入图片描述
得到偏移为40
我们的最终目的是为了获取shell,在IDA里面可以看见程序提供shell
在这里插入图片描述
我们还需溢出第二个gets到ret的位置并且覆盖ret地址为当前sh地址
偏移为当前canary地址到ret地址

在这里插入图片描述
得到v6的地址为
在这里插入图片描述
因为这里的canary已经被覆盖
而v6距离ebp为0x4
所以此时只需要计算v6到ebp的偏移即可
在这里插入图片描述
构造的exp
在这里插入图片描述
运行脚本得到shell本题结束。
在这里插入图片描述
题目链接:https://bamboofox.cs.nctu.edu.tw/courses/3/challenges/61

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您的问题是关于利用格式化漏洞泄露canary利用ROP执行shell的问题。 首先,格式化漏洞是一种常见的安全漏洞,可以通过控制格式化字符串的方式来读取和修改内存中的数据。其中,canary是一种用于防御缓冲区溢出攻击的机制,它会在程序的栈上插入一个随机值,并在程序退出时检查该值是否被修改,以此来检测是否发生了缓冲区溢出攻击。 利用格式化漏洞泄露canary的一般思路是通过格式化字符串的方式来读取栈上的数据,包括canary的值,然后利用这个值来构造一个假的栈帧,绕过canary的检测。具体实现上,可以使用类似于%lx的格式化字符串来读取栈上的数据。 接下来,利用ROP执行shell的一般思路是通过利用程序中已有的代码段来构造一个ROP链,以此来执行一段自己构造的代码。这个过程需要先找到程序中已有的可用代码段,然后将这些代码段的地址和参数压入栈中,最终利用ret指令来跳转到这些代码段的地址,以此来执行一段自己构造的代码。具体实现上,可以使用一些ROP工具来辅助构造ROP链,比如ROPgadget、ROPtool等。 需要注意的是,利用格式化漏洞和ROP执行shell都是一些高级的安全攻击技术,需要有深入的理解和实践经验。同时,这些攻击技术也可能会被防御措施所阻挡,因此在实际攻击中需要根据具体情况来选择合适的攻击方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值