看不见的彼方:交换空间——小菜一碟

news2025/1/14 12:24:44

有个蓝色的链接,先去看看两年前的题目的write up

(https://github.com/USTC-Hackergame/hackergame2022-writeups/blob/master/official/%E7%9C%8B%E4%B8%8D%E8%A7%81%E7%9A%84%E5%BD%BC%E6%96%B9/README.md)

从别人的write up中了解到,可以用信号和IPC来传递数据,而这个IPC指的就是消息队列(msgget 等)和共享内存(shmget 等),注意一定要使用System V的 API,因为posix的那几个会依赖文件系统而不能使用。

进程间通信的问题解决了,接下来就是内存限制的处理了。虽然不能完全复制,但是一次复制个2MiB 还是没问题的。开一个2MiB大小的共享内存空间,然后前半部分用来把A的文件内容传给B,后半部分用来把 B 的文件内容传给 A,写入到文件的时候直接原位置覆盖写入即可。每次传递两个1MiB 大小的文件片段,再加上用消息队列跨进程同步,整个事情就成了。

容器内存限制 316 MiB,你提交的程序文件会复制为两份,分别占用一份内存空间。环境限制总 PID 数为 32。对于 chroot 内部的进程,只有 /space 可读写。/space(/home/pwn/A/space/ 和 /home/pwn/B/space/)为 tmpfs,使用内存空间。


已经尝试过让AI生成代码,但还是不行,代码这块我不熟悉,下面是大佬的write up的代码:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/msg.h>
#include <sys/shm.h>

void perror_exit(char* message){
	perror(message);
	exit(-1);
}

struct message {
    long type;
    char buffer[4];
};

int main()
{
	printf("a start\n");
	int mqab=msgget(12450,0666 |IPC_CREAT);
	if(mqab<0){
		perror_exit("msgget swapab error");
	}
	int mqba=msgget(12451,0666 |IPC_CREAT);
	if(mqba<0){
		perror_exit("msgget swapba error");
	}
	int shm=shmget(12452,2*1024*1024,0666 |IPC_CREAT);
	if(mqba<0){
		perror_exit("shmget error");
	}
	void* mem=shmat(shm,0,0);
	if(mem==(void*)(-1)){
		perror_exit("shmat error");
	}
	int fd=open("/space/file",O_RDWR);
	if(fd<0){
		perror_exit("open error");
	}
	printf("a ok\n");
	char* read_start=((char*)(mem));
	char* write_start=((char*)(mem))+1024*1024;
	for(int i=0;i<128;i++){
		int segment_start=i*1024*1024;
		// 读出文件内容
		off_t read_off=lseek(fd,segment_start,SEEK_SET);
		if(read_off<0){
			perror_exit("lseek error");
		}
		int read_count=0;
		while(read_count<1024*1024){
			int read_len=read(fd,read_start+read_count,1024*1024-read_count);
			if(read_len<0){
				perror_exit("read error");
			}
			read_count+=read_len;
		}
		// 发送同步信号
		struct message out;
		out.type=1;
		if (msgsnd(mqab, &out, sizeof (struct message), 0) <0) {
			perror_exit("msgsnd error");
        }
		// 接收同步信号
		struct message in;
		if (msgrcv(mqba, &in, sizeof (struct message),0, 0) <0) {
			perror_exit("msgrcv error");
        }
		// 写回文件内容
		off_t write_off=lseek(fd,segment_start,SEEK_SET);
		if(write_off<0){
			perror_exit("lseek error");
		}
		int write_count=0;
		while(write_count<1024*1024){
			int write_len=write(fd,write_start+write_count,1024*1024-write_count);
			if(write_len<0){
				perror_exit("write error");
			}
			write_count+=write_len;
		}
	}
	printf("a complete\n");
}
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/msg.h>
#include <sys/shm.h>

void perror_exit(char* message){
	perror(message);
	exit(-1);
}

struct message {
    long type;
    char buffer[4];
};

int main()
{
	printf("b start\n");
	int mqab=msgget(12450,0666 |IPC_CREAT);
	if(mqab<0){
		perror_exit("msgget swapab error");
	}
	int mqba=msgget(12451,0666 |IPC_CREAT);
	if(mqba<0){
		perror_exit("msgget swapba error");
	}
	int shm=shmget(12452,2*1024*1024,0666 |IPC_CREAT);
	if(mqba<0){
		perror_exit("shmget error");
	}
	void* mem=shmat(shm,0,0);
	if(mem==(void*)(-1)){
		perror_exit("shmat error");
	}
	int fd=open("/space/file",O_RDWR);
	if(fd<0){
		perror_exit("open error");
	}
	printf("b ok\n");
	char* read_start=((char*)(mem))+1024*1024;
	char* write_start=((char*)(mem));
	for(int i=0;i<128;i++){
		int segment_start=i*1024*1024;
		// 接收同步信号
		struct message in;
		if (msgrcv(mqab, &in, sizeof (struct message),0, 0) <0) {
			perror_exit("msgrcv error");
        }
		// 读出文件内容
		off_t read_off=lseek(fd,segment_start,SEEK_SET);
		if(read_off<0){
			perror_exit("lseek error");
		}
		int read_count=0;
		while(read_count<1024*1024){
			int read_len=read(fd,read_start+read_count,1024*1024-read_count);
			if(read_len<0){
				perror_exit("read error");
			}
			read_count+=read_len;
		}
		// 写回文件内容
		off_t write_off=lseek(fd,segment_start,SEEK_SET);
		if(write_off<0){
			perror_exit("lseek error");
		}
		int write_count=0;
		while(write_count<1024*1024){
			int write_len=write(fd,write_start+write_count,1024*1024-write_count);
			if(write_len<0){
				perror_exit("write error");
			}
			write_count+=write_len;
		}
		// 发送同步信号
		struct message out;
		out.type=1;
		if (msgsnd(mqba, &out, sizeof (struct message), 0) <0) {
			perror_exit("msgsnd error");
        }
	}
	printf("b complete\n");
}

编译之后上传文件:

成功得到flag:flag{just A p1ece 0f cake_2e65492b77}

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

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

相关文章

以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式

1.问题描述 部署微服务&#xff0c;文件、代码是延用的mysql类型的&#xff0c;部署前做了部分适配&#xff0c;但是在使用dm数据库进行安装的服务在页面上查询出的数据却都是乱码 2.查询官网&#xff0c;注意到一个参数COMPATIBLE_MODE兼容模式的配置 考虑是延用mysql&…

K2升班卷(C++ 3道题)

目录 1.匹配 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例 1 解释 数据规模与约定 提示 2.乘方 题目描述 输入格式 输出格式 输入输出样例 数据规模与约定 3.缺水的王国 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例解…

Redis(4):主从复制

一、主从复制概述 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。   默认情况下&#xff0c;每台Redis…

Educator头歌:离散数学 - 图论

第1关&#xff1a;图的概念 任务描述 本关任务&#xff1a;学习图的基本概念&#xff0c;完成相关练习。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;图的概念。 图的概念 1.一个图G是一个有序三元组G<V,R,ϕ>&#xff0c;其中V是非空顶点集合&am…

linux模拟HID USB设备及wireshark USB抓包配置

文章目录 1. 内核配置2. 设备配置附 wireshark USB抓包配置 linux下模拟USB HID设备的简单记录&#xff0c;其他USB设备类似。 1. 内核配置 内核启用USB Gadget&#xff0c;使用fs配置usb device信息。 Device Drivers ---> [*] USB support ---><*> USB …

Trimble X12助力电力管廊数据采集,为机器人巡视系统提供精准导航支持

地下电缆是一个城市重要的基础设施&#xff0c;它不仅具有规模大、范围广、空间分布复杂等特点&#xff0c;更重要的是它还承担着信息传输、能源输送等与人们生活息息相关的重要功能&#xff0c;也是一个城市赖以生存和发展的物质基础。 01、项目概述 本次项目是对某区域2公里左…

Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看&#xff1a;Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1&#xff0c;编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数&#xff0c;…

嵌入式硬件实战基础篇(四)多路直流稳压电源

设计一个多路直流稳压电源 要求设计制作一个多路输出直流稳压电源,可将220 V / 5 0HZ交流电转换为5路直流稳压输出。具体要求&#xff1a; 输出直流电压 12V&#xff0c; 5V;和一路输出3- 15V连续可调直流稳压电源: 输出电流Iom500mA; 稳压系数 Sr≤0.05;

# MySql字符集报错

MySql报 java.sql.SQLException: Incorrect string value 乱码解决方法 文章目录 MySql报 java.sql.SQLException: Incorrect string value 乱码解决方法修改数据库字符集和排序规则检查数据库字符集和排序规则修改数据库字符集和排序规则&#xff08;谨慎操作&#xff09;修改…

CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标

注&#xff1a;本文为 “CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标” 几篇相关文章合辑。 文章中部分超链接异常、图片模糊限于引用原文原状。 相机自动对焦原理 TriumphRay 于 2020-01-16 18:59:41 发布 凸透镜成像原理 这一部分大家中学应该就学过…

用MATLAB符号工具建立机器人的动力学模型

目录 介绍代码功能演示拉格朗日方法回顾求解符号表达式数值求解 介绍 开发机器人过程中经常需要用牛顿-拉格朗日法建立机器人的动力学模型&#xff0c;表示为二阶微分方程组。本文以一个二杆系统为例&#xff0c;介绍如何用MATLAB符号工具得到微分方程表达式&#xff0c;只需要…

堆排序(含证明)

引言 前面我们讲过堆的基本操作的实现&#xff0c;现在给定一个int类型的数组&#xff0c;里面存放的数据是无序的&#xff0c;我们如何利用堆的思想来实现数组内数据的升序排列或降序排列呢&#xff1f; 通过前面讲到的堆的实现&#xff0c;我们可以想到&#xff0c;我们再开…

前海湾地铁的腾通数码大厦背后的临时免费停车点探寻

临时免费停车点&#xff1a;前海湾地铁的腾通数码大厦背后的桂湾大街&#xff0c;目前看不仅整条桂湾大街停了​车&#xff0c;而且还有工地餐点。可能是这个区域还是半工地状态&#xff0c;故暂时还不会有​罚单的情况出现。 中建三局腾讯数码大厦项目部A栋 广东省深圳市南山…

Wend看源码-Durid

项目地址 GitHub - alibaba/druid: 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品&#xff0c;为监控而生的数据库连接池 简介 Druid连接池是阿里巴巴开源的数据库连接池项目&#xff0c;自2011年开源以来&#xff0c;它因其卓越的…

GY302光照传感器模块详解

目录 一、引言 二、功能特点 三、工作原理 四、引脚功能 五、应用场景 六、使用方法 七、总结 一、引言 在当今科技飞速发展的时代&#xff0c;传感器技术在各个领域都发挥着至关重要的作用。光照传感器作为一种能够感知环境光照强度的设备&#xff0c;广泛应用于农业、…

分布式事务调研

目录 需求背景&#xff1a; 本地事务 分布式基本理论 1、CAP 定理 2、BASE理论 分布式事务方案 #2PC #1. 运行过程 #1.1 准备阶段 #1.2 提交阶段 #2. 存在的问题 #2.1 同步阻塞 #2.2 单点问题 #2.3 数据不一致 #2.4 太过保守 3PC #本地消息表 TCC TCC原理 …

win10系统部署RAGFLOW+Ollama教程

本篇主要基于linux服务器部署ragflowollama&#xff0c;其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核&#xff1b; RAM ≥ 16 GB&#xff1b; 磁盘 ≥ 50 GB&#xff1b; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机&#xff…

自然语言处理期末试题汇总

建议自己做&#xff0c;写完再来对答案。答案可能存在极小部分错误&#xff0c;不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

Android Studio的AI工具插件使用介绍

Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用&#xff0c;以下是一些常见的方面&#xff1a; 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释&#xff0c;解读某段代…

iQOO Neo10系列携三大蓝科技亮相,性能与续航全面升级

11月29日&#xff0c;iQOO Neo10系列正式登场。作为iQOO Neo系列的最新力作&#xff0c;Neo10系列不仅延续了该系列一贯的“双芯”特色&#xff0c;更在性能、续航、屏幕、影像等多个方面实现了全面升级&#xff0c;为用户带来前所未有的使用体验。此次发布的Neo10系列共有两款…