Hackergame 2023题解(二)
本文是Hackergame 2023题解的第二部分。
JSON ⊂ YAML?查看题面你知道吗?Hackergame 出题时,每道题都需要出题人用 YAML 格式写下题目的关键信息。然而,每年总有一些出题人在编写 YAML 文件时被复杂的语法规则弄得头疼不已。
这天小 Z 又找到小 W 说:「我昨天写 YAML 时,又花了半天研究 YAML 的规范,YAML 好难啊!」
小 W 惊讶道:「怎么会有人不会写 YAML 呢?只要你会写 JSON 就会写 YAML 呀,因为任何合法的 JSON 本身就是合法的 YAML。」
小 Z 听闻这番言论后当场表示怀疑,立刻说出了一个字符串,JSON 和 YAML 解析出的含义存在差异。小 W 研究了一番才发现,这是因为很多主流的 YAML 库仍然是 YAML 1.1 的,它没有这个性质。他不得不承认:「好吧,这个性质只适用于 YAML 1.2。」
小 Z 笑了:「别提 YAML 1.2 了,它遇到合法的 JSON 都有可能报错。」
本题附件
JSON ⊄ YAML 1.1第一问需要找到一个JSON字符串,使其被json解析的结果与被yaml1.1解 ...
Hackergame 2023题解(一)
本文是Hackergame 2023题解的第一部分。
Hackergame 启动查看题面大声喊出 Hackergame 启动,开始今年的冒险!
解法1:直接点击提交,发现URL多出参数?similarity=,手动补成?similarity=114514再访问即可。
解法2:多喊几遍Hackergame 启动!让相似度达到100%。
flag{We1ComE-70-hACkEr9aME-4nD-enjoY-h4Ck!nG-z0Z3}
虽然不玩原神,但还是被洗脑了。。。
猫咪小测查看题面
想要借阅世界图书出版公司出版的《A Classical Introduction To Modern Number Theory 2nd ed.》,应当前往中国科学技术大学西区图书馆的哪一层?(30 分)
提示:是一个非负整数。
今年 arXiv 网站的天体物理版块上有人发表了一篇关于「可观测宇宙中的鸡的密度上限」的论文,请问论文中作者计算出的鸡密度函数的上限为 10 的多少次方每立方秒差距?(30 分)
提示:是一个非负整数。
为了支持 TCP BBR 拥塞控制算法,在编译 Linu ...
Hackergame 2023题解(零)
又是一届快乐的Hackergame,今年神仙附体,拿到校内rank2,总排名rank13,是自19年开始玩Hackergame以来的最好成绩,可喜可贺可喜可贺!
引用站外地址,不保证站点的可用性和安全性
本次比赛的官方存档
GitHub
题解下面是本次比赛解出题目的题解:
Hackergame 2023题解(一)
Hackergame 启动、猫咪小测、更深更暗、旅行照片 3.0、赛博井字棋、奶奶的睡前 flag 故事、组委会模拟器、虫
Hackergame 2023题解(二)
JSON ⊂ YAML?、Git? Git!、HTTP 集邮册、Docker for Everyone、惜字如金 2.0、🪐 高频率星球、🪐 小型大语言模型星球
Hackergame 2023题解(三)
🪐 流式星球、🪐 低带宽星球(小试牛刀)、Komm, süsser Flag ...
PKU GeekGame 3rd题解(二)
本文是本次PKU GeekGame题解的第二部分。
简单的打字稿查看题面
尊敬的用户,您好!
我们深刻认识到,大力推广使用TypeScript这门优秀的编程语言,将对我国社会主义现代化建设产生深远的正面影响。我们梳理了TypeScript与现代化建设的结合点,并进行了详细阐述,请您评价。
…
我们呼吁北大等高校里富有社会责任感的青年学子,在学习TypeScript技能的同时,将之用于服务国家发展大局。让我们继续在信息技术进步的道路上阔步前行,以TypeScript为工具,建设一个我们夢想中的社会主义现代化强国,以人民为中心,实现中华民族伟大复兴!
显然,题面要是让 Claude 生成,就会变成上面那个鬼样。
不过前人说,TypeScript 确实很安全,至少对于类型来说更是如此。那么若我把 Flag 放在类型里,阁下又将如何应对?
type flag1 = 'flag{...}'
type flag2 = object | { new (): { v: () => (a: (a: unknown, b: { 'flag{.. ...
PKU GeekGame 3rd题解(一)
本文是本次PKU GeekGame题解的第一部分。
一眼盯帧本题附件从没见过如此简单直接的签到题,只要眼睛够快,看一遍动图就能算出flag。
拿到题,搜个在线GIF逐帧查看器,然后把字符抄一下,发现前四个字母是synt,就搜了一个在线rot13解码网站,解出flag。但动作慢了,只抢了8血。
小北问答!!!!!这次的问答题属实有点难顶,提交居然有一小时冷却时间。。。就算防爆破,冷却时间设个一分钟也差不多了,一小时的话就,真的很急急急!
题目如下:查看题面
在北京大学(校级)高性能计算平台中,什么命令可以提交一个非交互式任务?答案格式:^[a-z]+$
根据 GPL 许可证的要求,基于 Linux 二次开发的操作系统内核必须开源。例如小米公司开源了 Redmi K60 Ultra 手机的内核。其内核版本号是?答案格式: ^\d+.\d+.\d+$
每款苹果产品都有一个内部的识别名称(Identifier),例如初代 iPhone 是 iPhone1,1。那么 Apple Watch Series 8(蜂窝版本,41mm 尺寸)是什么?答案格式: ^[a-zA-Z]+\d+,\d+$
本 ...
PKU GeekGame 3rd题解(零)
在科研的压力下,一年一度的GeekGame成了一个消遣放松的绝好借口不过为什么感觉打这个比赛比搞科研更累?。
今年的比赛顺利取得总排名36/1012(通过签到题的人数),并且在一周的比赛时间内又学到了不少一年前可能学过但又忘了的东西,算是非常有收获。按老规矩,继续写篇题解记录一下本菜狗的解题过程。
引用站外地址,不保证站点的可用性和安全性
本次比赛的官方存档
GitHub
题解
PKU GeekGame 3rd题解(一)
一眼盯帧、小北问答!!!!!、Z 公司的服务器、基本功、Emoji Wordle、第三新XSS
PKU GeekGame 3rd题解(二)
简单的打字稿(Super Easy)、汉化绿色版免费下载、初学 C 语言(Flag 1)、绝妙的多项式、关键词过滤喵,谢谢喵(字数统计喵)、小章鱼的曲奇、华维码(华维码 · 特难)
总结本次比赛比去年学到了更多的内 ...
从零开始的麻将AI论文复现(二)
本来想省略掉所有麻将游戏的实现细节的,但后来发现强化学习算法需要一个游戏环境,因此完整实现一整套麻将游戏的流程也属于论文复现的一部分,还是有必要对游戏实现时遇到的一些技术细节进行解释。
如何判定和牌立直麻将共有三种和牌形,分别是:
面子手:m * AAA + (4-m) * ABC + DD
七对:7个互不相同的对子
国士无双:所有幺九牌各一张,并且其中之一成对子
七对和国士无双比较容易判定,但面子手的和牌形涉及到刻子、顺子、雀头的不同拆分,判定方法会比较麻烦。最容易想到的方法就是用dfs遍历所有的拆分可能性,如果能拆分完全,则满足面子手形状。曾经我也实现过这个算法,但dfs的问题在于时间复杂度不是很能接受。
考虑一个用程序实现的麻将游戏,这个程序在什么时候会需要进行和牌的判定?实际上,在每一个玩家摸完牌之后,程序都需要为该玩家判定一次和牌;另外,当玩家切出一张牌时,程序都需要为其他三位玩家各判定一次和牌。因此,在一局20巡目左右的麻将游戏中,程序大约共需要进行至少20 * 4=80次和牌判定。另外,程序还需要为玩家判定一手牌是否听牌、是否可以立直等,显然这两者比和牌判定更为复杂。 ...
从零开始的麻将AI论文复现(一)
这篇文章,我来介绍一下我对麻将局面信息的特征编码方法。
首先,通过阅读论文,我们了解到Suphx在「弃牌模型」和「立直模型」中使用了通道多达838的特征,而「鸣牌模型」用到的特征更是多了120个通道。文中给出了一些比较基本的特征的编码方法,但对于这多达838个通道都是如何编码来的并未详细说明(其实是直接没说),不过,我们完全可以先做一个简化版的出来,日后再慢慢增加特征。
手牌编码论文的图片已经很形象地说明了手牌的编码方法。该方法将手牌编码为4通道的34维向量,即形状为(4,34)的矩阵。首先将34种牌编码为0-33,当玩家手牌中拥有X张Y(0≤Y≤33)的时候,就将该矩阵第Y列的前X个元素置为1。
为了编码的方便,我们可以为每个Agent维护一个手牌计数器,然后通过下面的函数即可生成编码:
def get_hand_tile_feature(self, counter):
"""
自家手牌
:param counter: Counter
:return: (4, 34)
"""
feature = np.zeros(shape=(4, ...
从零开始的麻将AI论文复现(零)
前段时间,博主突然开始沉迷偶尔玩玩立直麻将,受自己“职业病”的影响,遂想着能不能搞个AI出来帮我上段。
先找找有没有现成的算法。上网一搜,发现果然早有不少麻将AI的算法诞生了,比如东京大学开发的「爆打」、由Dwango发布的「NAGA25」、由MSRA开发的「Suphx」等。看了一圈,决定试着复现一下「Suphx」。
论文简介论文传送门如下:
引用站外地址,不保证站点的可用性和安全性
Suphx: Mastering Mahjong with Deep Reinforcement Learning
arXiv
如论文所说,该算法仅在监督学习下就能达到人类顶级水平,而在self-play以及reinforcement learning算法的加持下,Suphx能够达到特上房的最高段位十段,其稳定段位更是能达到8.7段,远超人类高手的稳定段位:7.4段。
Suphx并没有开源代码,因此唯一 ...
PKU GeekGame 2nd 部分题目Write-Up
GeekGame 2nd结束了,今年的题没有了去年那种套娃,难度有所下降,总体感觉不错,也取得了比去年更高的总排名(29),对一名非专业菜鸟玩家而言,我已经相当满意。
更重要的是,我在解题过程中学到了不少东西,也获得了不少乐趣,而不是像去年那样晕头转向没有方向感。
引用站外地址,不保证站点的可用性和安全性
本次比赛的官方存档
GitHub
†签到†去年的签到我想了半个小时,今年只用了20秒。别问,问就是一模一样,见去年的题解。(PKU GeekGame的出题人怎么不在签到题上点心。 官方题解出来后发现其实和去年的签到是有区别的,这次的PDF用某些阅读器打开会发现无法复制,然而我是用Chrome的沙拉查词插件带的PDF阅读器打开的,因此不受影响。
本题附件
小北问答 · 极速版查看题面菜宝十分擅长网上冲浪,会使用十种甚至九种搜索引擎。本届 PKU GeekGame 一开始,她就急不可耐地 ...
USTC Hackergame 2022小部分题目Write-Up
Hackergame 2022留给我一段让我这个恋爱脑非常难受的回忆:
今年Hackergame开始当天,科大因为疫情原因封校了,女朋友被封在了学校里,而我住在校外进不了校,因此情绪上受到了比较大的影响,导致今年没心情认真做题,后面的难题压根没心思看,只完成了一些比较靠前的题。明年继续努力!
截图于比赛截止日前一天,目前排名已掉至49
引用站外地址,不保证站点的可用性和安全性
本次比赛的官方存档
GitHub
签到查看题面众所周知,签到题是一道手速题。
为了充分发挥出诸位因为各种原因而手速优异于常人的选手们的特长,我们精心设计了今年的签到题。进一步地,为了更细致地区分不同手速的选手,我们还通过详尽的调研及统计分析,将签下字符的时间限制分为了多个等级。只有最顶尖的手速选手,才能在 CPU 来得及反应之前顺利签下 2022,从而得到光荣的 flag!
签到题要求在四块手写区域分别写下 ...
局域网下禁止某些域名的AAAA解析
在双栈上网环境下,有一个很常规的需求,即我们需要避免使用IPv6地址来访问某些网站(如果你无法理解这种需求,就不需要看下去了)。
首先,由于需要访问某些IPv6 only的网站,我并不希望禁止全局AAAA解析。虽然很多操作系统可以设置IP协议的优先级,但若能从源头解决问题,当然是最好的,即能否只禁止解析这些指定域名的AAAA记录。
听说Smartdns这个软件提供了该功能,但无奈我在路由器上怎么都开不了这个软件(用过官方发布的release,也自己编译了几遍,均无用,可能是操作姿势不对)。后续研究了一下,发现其实只用Dnsmasq就可以做到这一点。
假设我们需要禁止域名example.com的AAAA解析,那么只需在Dnsmasq的配置文件(位于/etc/dnsmasq.d/目录下)中添加如下一条:
address=/example.com/::
并重启Dnsmasq。如此一来,等原先的DNS缓存过期以后访问该域名就可以正常走IPv4流量了。
在Ubuntu桌面系统用原生微信的方法
优麒麟系统(Ukylin)推出了原生的微信,于是我们把优麒麟软件源里的微信拿过来用即可。(补:都用Linux系统了还是别用微信了罢)
首先我们建立一个新的sourse.list文件,用于放置Ukylin的软件源:
sudo vi /etc/apt/sources.list.d/ukapps.list
在打开后的文件中添加以下内容:
deb http://archive.ubuntukylin.com/ubuntukylin focal-partner main
然后导入软件源的密钥:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 56583E647FFA7DE7
接下来,执行:
sudo apt update
sudo apt install weixin
即可安装微信!体验上佳,只是没表情包、朋友圈,如下:
Ubuntu桌面系统下双击运行sh文件
在桌面系统的Ubuntu下,我们运行sh文件通常仍需要打开终端,然后敲一条命令才能运行,非常麻烦,很自然的想法就是是否可以像windows一样通过双击的方式,来运行一个sh文件。
早一些版本的Ubuntu系统似乎是可以直接在文件系统里进行设置的,而我用的版本并没有该功能的直接设置界面(反正我没找到),因此需要安装一个软件:
sudo apt install dconf-editor
然后运行:
dconf-editor
依次选中以下选项:
然后可以在Custom value中将’display’替换为’ask’。
最后,右键sh文件选中Properties,在Permissions栏下勾选Allow executing file as program。如此,在双击sh文件的时候,便会对你进行询问:
通过ZeroTier实现外网设备与局域网内所有设备互联
前一篇文章,我们已经可以通过为设备安装ZeroTier软件来接入虚拟局域网,以此实现P2P访问,但这种方案的问题在于,需要为每一台想接入的设备均安装ZeroTier软件并在控制台加入网络,非常不方便。
其实我们只需要在局域网的出口设备——路由器上安装该软件,并进行一定的配置,就可以达到外网访问任意局域网设备的效果。
前置条件
路由器系统:OpenWrt
一个ZeroTier虚拟局域网ID
OpenWrt内网段(文中假设为192.168.0.0/24)与ZeroTier虚拟网段无冲突
愿意捣鼓、无惧踩坑的你
OpenWRT端软件配置后文将默认你已经在OpenWrt上成功安装了ZeroTier客户端,否则请出门左转~
首先,如果是自建planet,我们需要将planet文件放到ZeroTier的配置目录下,planet文件的生成方法见此文。如果是自建moon,则需要将moon文件放置到配置目录的moons.d目录下,本文假设配置目录为/etc/zerotier。需要注意的是,OpenWrt下某些版本的ZeroTier,行星服务器的配置文件名可能并不是planet,而是world。
接下 ...
自建一个ZeroTier行星/卫星服务器
ZeroTier是一款好用的P2P虚拟局域网开源软件,通过它可以实现外网到内网设备的访问。本文从服务端到客户端一条龙搭建一个简单的ZeroTier虚拟局域网,实现从外网对内网树莓派的访问。
ZeroTier的优点有:
非常容易配置,只要拿到虚拟网络的ID,就可以加入网络,并自动分配IP地址,对小白具有亲和力。
虚拟网络内的设备端对端建立连接,不需要经过中转服务器,响应快,不受服务器带宽、流量限制。
但其缺点也很明显,其官方的服务器位于国外,直连状态下容易打洞失败,这样第二条优点便无法体现。
为了改善使用体验,我们可以通过搭建moon服务器进行加速,或者也可以直接建一个行星服务器(planet),来实现自己的ZeroTier服务。
前置条件
一台拥有公网IP的服务器
服务器上有docker、docker-compose(因为我后面的操作就是通过docker的,非docker部署法请自行谷歌)
服务端安装因为有大佬开源的docker镜像keynetworks/ztncui,因此安装的过程比较方便,但该镜像默认只提供一个管理平台,若直接使用该镜像而不加以任何修改,则并不能提供plane ...
使用Nginx反向代理ShareLaTeX服务并配置SSL
前面已经为WordPress配置了反代,此文将给出Nginx反代ShareLaTeX的配置。
首先,我们将ShareLaTeX的docker容器映射到一个宿主机上不常用的空闲端口(例如8080)。
然后配置Nginx:
server{
listen 80;
listen 443 ssl;
server_name latex.fyz666.xyz;
index index.php index.html index.htm;
ssl_certificate /etc/letsencrypt/live/blog.fyz666.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.fyz666.xyz/privkey.pem;
if ($scheme = http){
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://127.0.0. ...
使用Nginx反向代理WordPress并配置SSL
此举是为了将原先部署在443端口的WordPress网站使用反向代理的方式重新部署。部署反代的过程踩了不少的坑,主要还是因为WordPress作为动态博客框架所具有的特殊机制。(说起这个就要后悔当时为啥没搞个静态博客了)
首先介绍一下环境,我的WordPress网站运行在docker容器下,由Apache服务启动,原先的配置是docker容器内的Apache配置了SSL证书,并将容器443端口映射至宿主机。
为了在宿主机上用Nginx做反代,首先要对容器内的服务进行一些修改。两次SSL肯定是不划算的,因此首先要将容器内的Apache服务停用https,然后我们修改容器的端口绑定为0.0.0.0:8000->80/tcp(这个8000随便选一个宿主机的空闲端口即可,后面Nginx配置反代时会用到)。注意:这个时候WordPress数据库内站点的地址仍然是https的地址,为了站点的优雅,这里的地址不要改动。
接下来,配置Nginx,首先要确保安装的Nginx支持SSL(可通过nginx -V查看是否有SSL相关的模块)。
server{
listen 80;
li ...
使用Let's Encrypt生成通配符证书
本站长期以来维护着多个Web服务,除了此博客外,还有一个部署在80端口的ShareLaTeX以及其他杂七杂八的网站,这些站点没有https,每次访问时还得手动输入http://以及端口号,感觉既不安全也不优雅。因此最近我想用反代优化一下服务器站点的URL分配。
我所期望的结果是:
将所有网站服务均反代到443端口。
通过域名对服务进行区分。
所有服务都开启SSL。
那么不可避免地,我需要申请一张多域名的SSL证书(不然得各自申请证书,维护起来过于麻烦)。基于一劳永逸的考虑,这里我决定直接为通配符域名*.fyz666.xyz申请证书。
各大平台出售的通配符证书都贼贵,但这种东西明明是可以免费的,何必花这个冤枉钱。Let’s Encrypt早已支持通配符SSL证书的签发,而且十分方便。
我的环境如下:
阿里云的Ubuntu 18.04镜像服务器,运行了多个Web服务,每个Web服务都独立运行在一个docker容器中。
接下来,我们安装Certbot:
sudo apt install certbot
安装完成后,准备用该程序来签发证书。运行certbot:
sudo certbot c ...
中科大中区游泳馆购票脚本
鉴于游泳馆预约平台已经更换,本文所述方法已失效。
最近天气逐渐变热,同学们对中区游泳池的需求量越来越大,票一放出来,没多久就抢完了,没点手速还真抢不过。因此,我决定深入研究一下购票系统,看看能不能写个脚本。
这回用到的软件还是Charles,配置方法见前面的一篇文章。下面直接开始抓包。
将手机连上Chalres代理,登录购票系统,随便找一张票,选定日期,点击“提交订单”,进入了“订单详情”页面,等待几秒后,点击“我已阅读并同意此协议”,此时,Charles抓到了一条我们需要的数据包:
这是条Post请求,向https://yuyue.ustc.edu.cn/client/easyserpClient/ticket/freeBuyTicket发送了一个表单,表单内容为:
参数
说明
ticketInfo
票务信息(包含id与价格)
token
一个疑似用于身份认证的字符串
shopNum
经测试为常量
useDay
日期(%Y-%m-%d)
经分析,表单参数ticketInfo中的tickedId的值与场次数相关,每天的第n场对应的ticketId为 ...