介绍一种不优雅的Hack在OI竞赛中的评测机的方法
SparrowHe 2020-12-27原创 软件综合

0x00 前言

首先说一下什么叫评测机。在信息学竞赛中,往往是给出一道题目要求选手编写程序完成题目所要求的任务,根据给定的输入文件,计算得出一个输出文件,评测机会将程序的输出文件和标准答案进行对比,返回正确与否的结果。还可限制任务运行的时间、内存、可使用函数等

本文背景及文章内容纯属虚构,旨在分享在开发评测机可能遇到的问题,如有评测机工作原理与本文描述雷同,纯属巧合

任何Hack评测机的行为都是作弊行为,本文里所介绍的方式仅供参考,请不要在实战中运用。上一个在洛谷搞AC自动机的人已经gg了。

0x01 介绍

这篇文章的作者在github上某个隐蔽的角落找到了某个不知名的小评测机。简单测试发现并没有对穿越目录的行为进行限制,而且可以直接读到答案文件AC,为防止作弊嫌疑,故不在此放出评测机名字。

0x02 目录结构

创建一个比赛,看到生成了一堆文件(夹),在 players 文件夹下放置选手代码,编译后产物在 tmp 文件夹,并在此中执行,评测数据在 examdata 。

评测时会同时从评测数据中复制一个输入数据在 tmp 文件夹中,命名为 {题目名称}.in

选手程序需要读取该文件作为数据并将答案输出到 {题目名称}.out ,随后进行比对。是很原始的文件io。

0x03 Codeing

得知以上运行逻辑便可编写出一段测试(伪)代码:

fs.readFileSync(`../examdata/ ${problemName}${testNo}.ans`)

来读入文件。

这样我们就轻松AC了一个点,那么其他点怎么搞呢。

其实我们读入到给出的输入文件后,可以去评测数据文件夹中遍历查找,然后输出对应的文件。就结束了?没错,就这样就结束了。

0x03 Fix

修复起来其实也不是什么难事,不过看到上一次commit时间还在N年前就没有维护的欲望了。不过还是在此放出修复方法。

  1. 限制权限,单独开用户运行选手代码,不给读取评测数据文件夹的权限

  2. 改用标准输入输出,对输出文件进行加密,由评测机解密后比较


[修改于 1 个月前 - 2020-12-27 03:36:38]

来自:计算机科学 / 软件综合
7

想参与大家的讨论?现在就 登录 或者 注册

%7B%22isDisplay%22%3Atrue%7D

仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
{{submitted?"":"投诉或举报"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
下载资料
{{fileName}}
大小:{{size}}
下载当前附件将花费 {{costMessage}}
你当前剩余 {{holdMessage}}
{{fileName}}
大小:{{size}}
当前附件免费。
你已购买过此附件,下载当前附件不需要花费积分。
加载中...
{{errorInfo}}
附件已丢失
当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}