紧张刺激的Hackergame2023结束了,第一次打hackergame,最后也拿到了自己十分满意的成绩当前分数:3750, 总排名:142 / 2386
- 写在这个仓库的wp是我做出来的题目
- 更多的wp和题目讨论会发布在我的博客上huayi's blog
- 还有我的笔记里huayi's notebook
- 欢迎来访!不然我的博客要变成单机游戏了😭
- 首先大喊Hackergame启动,url栏末尾出现
/?similarity=
- 修改
/?similarity=100
即可获取flag
Q1 想要借阅世界图书出版公司出版的《A Classical Introduction To Modern Number Theory 2nd ed.》,应当前往中国科学技术大学西区图书馆的哪一层?
- 搜索
中国科学技术大学西区图书馆
发现网页西区图书馆简介 - 因此外文图书在12层
Q2 今年 arXiv 网站的天体物理版块上有人发表了一篇关于「可观测宇宙中的鸡的密度上限」的论文,请问论文中作者计算出的鸡密度函数的上限为 10 的多少次方每立方秒差距?
- 搜索
可观测宇宙中的鸡的密度上限
答案23在这个知乎回答里
Q3 为了支持 TCP BBR 拥塞控制算法,在编译 Linux 内核时应该配置好哪一条内核选项?
- 搜索
TCP BBR Linux kernel config
,即得到答案CONFIG_TCP_CONG_BBR
Q4 🥒🥒🥒:「我……从没觉得写类型标注有意思过」。在一篇论文中,作者给出了能够让 Python 的类型检查器 MyPY mypy 陷入死循环的代码,并证明 Python 的类型检查和停机问题一样困难。请问这篇论文发表在今年的哪个学术会议上?
- 参考网站中下拉找到
软件工程/系统软件/程序设计语言
类的会议,手动爆破得到会议名为ECOOP
Crtl + a
Crtl + c
Crtl + v
粘贴即可获得flag
-
含有奖牌的图中是诺贝尔物理学奖和诺贝尔化学奖奖牌,根据题意,学长是东京大学学生,因此搜索东京大学诺贝尔奖得主,发现符号条件且出生最晚是
梶田隆章 1959.3 东京大学
,研究所名为ICRR,东京大学宇宙射线研究所 -
对暑假6 7 8 9月的日期爆破,得到日期2023.8.10
- 第一问搜索
東京 上野公園 "2023.8.10"
,发现是梅酒节,其中含有【ボランティアSTAFF募集】,发现编号为S495584522 - 第二问爆破,最后发现是0
- 第一问卡了一年还是没做出来,以后要仔细看看图片里的文字了(statphys28),答案是安田讲堂
- 第二问熊猫-秋田犬,搜索
ボタン&カフリンクス 上野
,答案熊猫在这个网站 - 由后面的马里奥推测是涉谷任天堂旗舰店,搜索
涉谷 3d
即得到答案秋田犬
- 和ai下一子
- F12打开控制台修改ai下的位置如
board[1][1] = 0
然后即可覆盖ai下的地方 - 轻松拿下游戏,重振人类井字棋荣光!
- 根据题目中 谷歌的『亲儿子』连系统都没心思升级 截图 在最后几个关键词googl搜索
- 发现google亲儿子系列pixel存在截图漏洞(事实上早期windows也存在)
- pixel acropalypse截图漏洞
- 检查工具
- 恢复工具
- 由于连系统都没心思升级,尝试低版本pixel,在系统为pixel3时就恢复成功了
- 可以进化成为高频率星人后再申请组委会
- 如果进化失败,可以使用人类的javascript脚本
setInterval(function() {
var x = document.getElementsByClassName("fakeqq-message__bubble");
for (var i = 0; i < x.length; i++) {
var content = x[i].textContent;
if (content.search(/hack\[/) != -1) {
console.log(content);
x[i].click();
}
}
}, 1500);
- SSTV:慢扫描电视(Slow-scan television)是业余无线电爱好者的一种主要图片传输方法,慢扫描电视通过无线电传输和接收单色或彩色静态图片。
- 推荐的工具MMSSTV,e2eSoft来读取.wav文件
- 这题没有真正读懂文档,乱试出来了第一题(赛后一定好好学习文档)
- 根据题意猜测是git回滚
git reflog
查看提交历史记录git reset --hard 505e1a3
回滚到含flag的版本,读取readme.md中的flag
- 参考资料
- 尝试了各种请求例子得到十二个状态码
- 无状态码:去掉http协议
docker run -v /:/mnt -it alpine
挂载根目录- 在mnt中寻找flag
- 发现
flag -> /dev/shm/flag
目录下 cat dev/shm/flag
读取
- 根据代码后面提示,每行应有24个字符,而原来每行只有23个,说明被惜字如金优化了
cod_dict += ['nymeh1niwemflcir}echaet']
cod_dict += ['a3g7}kidgojernoetlsup?h']
cod_dict += ['ulw!f5soadrhwnrsnstnoeq']
cod_dict += ['ct{l-findiehaai{oveatas']
cod_dict += ['ty9kxborszstguyd?!blm-p']
- 根据
flag{}
的格式恢复数据
cod_dict += ['nymeh1niwemflcir}echaete']
cod_dict += ['a3g7}kidgojernoetlsup?he']
cod_dict += ['ulw!ff5soadrhwnrsnstnoeq']
cod_dict += ['ctt{l-findiehaai{oveatas']
cod_dict += ['ty9kxborszstgguyd?!blm-p']
- 运行得到flag
asciinema play asciinema_restore.rec >> flag.js
- 查找删除多余的数据
nodejs flag.js
得到flag
- 输入
Am I smart?
- Python脚本随机爆破七位英文字母或六位英文字母
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
model = AutoModelForCausalLM.from_pretrained("roneneldan/TinyStories-33M")
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-neo-125M")
import random
def generate_random_str(randomlength=16):
random_str =''
base_str ='abcdefghigklmnopqrstuvwxyz'
length =len(base_str) -1
for i in range(randomlength):
random_str +=base_str[random.randint(0, length)]
return random_str
if __name__ == '__main__':
for i in range(10000):
prompt = generate_random_str(6)
# prompt = "Am I smart?"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
# Generate completion
output = model.generate(input_ids, max_length = 1000, num_beams=1)
# Decode the completion
output_text = tokenizer.decode(output[0], skip_special_tokens=True)
# Print the generated text
if "accepted" in output_text:
print(i, "-> OK")
print("prompt: ", prompt)
print("output: ", output_text)
break
else:
print(i, "-> no")
print("prompt: ", prompt)
- 运气好爆破成功了,爆破出来的结果应该不尽相同
- prompt: vffwmi
- output: accepted the cone and was so happy. She thanked the man and ran off with her cone. The cone was so delicious and she was so
- Python脚本读取二进制到flag.mp4
import cv2
import numpy as np
import time
for w in range(1500, 2000):
print("w = ", w)
h = w
num = int(135146688 / w / h / 3)
# 打开二进制文件
f = open('video.bin', 'rb')
# 创建VideoWriter对象
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*"mp4v"), num, (w, h), True)
# 循环读取二进制数据,并转换为图像
for i in range(0, num):
# 读取一帧的字节数
data = f.read(w*h*3)
# 如果没有数据,则退出循环
if not data:
break
# 将字节数据转换为一维数组
arr = np.frombuffer(data, dtype=np.uint8)
# 将一维数组转换为三维图像
img = arr.reshape(w, h, 3)
# 将图像写入视频文件
out.write(img)
# 释放资源
f.close()
out.release()
time.sleep(3)
- 先尝试几个宽和高,失败后人肉调频发现w=1708,h=1708时出现了4列多行的画面
- 于是w=1708/4=427得到正常一帧图片的宽,最后在视频中得到flag
- 第一问扔一个压缩网站里面就好了
- 想过打包main和动态链接库(但没用)
- 想过在根目录写入动态链接库(但Read Only)
- 想过运行时改变环境变量LD_PRELOAD(但已经迟了)
- 最后居然是静态链接直接绕过了函数
#include<stdio.h>
#include<stdlib.h>
int is_flag(const char *pathname) {
return 0;
}
int main()
{
// Read Only, open flag
printf("where is flag:");
FILE *fp;
char buffer[100];
fp = fopen("/flag", "rw");
if (fp == NULL) {
printf("no\n");
return;
}
while (fgets(buffer, 100, fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
- 会就玩,不会就枚举!
- 一个个试出来的,话说这真的是"二进制"题吗?
- 感谢hackergame幕后的工作人员,也感谢这七天疯狂烧脑互相陪伴的大家,下次还来!