「Hackergame 2022」#2 Writup 囤囤囤 0

这篇 Writeup 写一下 Hackergame 2022 里刚囤 flag 时做的一部分题:
旅行照片 2.0、猜数字、Flag 的痕迹、安全的在线测评、线路板、Flag 自动机、杯窗鹅影


旅行照片 2.0

你的学长决定来一场蓄谋已久的旅行。通过他发给你的照片来看,酒店应该是又被他住下了。

照片分析

第一部分是五个关于图片 exif 信息的问题,直接使用 exiftool 读取即可:

  1. 图片所包含的 EXIF 信息版本是多少?(如 2.1)。

exiftool 显示是 0231,但实际上是 2.31

  1. 拍照使用手机的品牌是什么?

exiftool 可以看到 Make: Xiaomi,所以答案是 小米/红米

  1. 该图片被拍摄时相机的感光度(ISO)是多少?(整数数字,如 3200)

ISO: 84,所以答案为 84

  1. 照片拍摄日期是哪一天?(格式为年/月/日,如 2022/10/01。按拍摄地点当地日期计算。)

Create Date: 2022:05:14 18:23:35.220027+09:00,所以答案为 2022/05/14

  1. 照片拍摄时是否使用了闪光灯?

Flash: Off, Did not fire(或者看反光也能看出来)所以答案为

flag:flag{1f_y0u_d0NT_w4nt_shOw_theSe_th3n_w1Pe_EXlF}

社工实践

接下来第二部分是五个关于图片社工分析的问题。

  1. 请写出拍照人所在地点的邮政编码,格式为 3 至 10 位数字,不含空格或下划线等特殊符号(如 230026、94720)。

通过放大图片可以看到楼下的体育馆外面写的有 “ZOZO” 样式,搜索可以找到这里是日本千叶海洋球场。通过 Google 地图找到拍照人所在地点:APA HOTEL& RESORT TOKYO BAY MAKUHARI 〒261-0021 Chiba, Mihama Ward, Hibino, 2 Chome-3,所以邮编为 2610021。(这里有个坑,日本邮编划分很细,球场和酒店的邮编不一样,所以要注意)

  1. 照片窗户上反射出了拍照人的手机。那么这部手机的屏幕分辨率是多少呢?(格式为长 + 字母 x + 宽,如 1920x1080)

通过京东搜索小米手机,以及玻璃反光中的后置摄像头样式可以知道这部手机是红米 Note 9,屏幕分辨率为 2340x1080

  1. 仔细观察,可以发现照片空中(白色云上方中间位置)有一架飞机。你能调查出这架飞机的信息吗?,包括 起飞机场(IATA 机场编号,如 PEK)、降落机场(IATA 机场编号,如 HFE)、航班号(两个大写字母和若干个数字,如 CA1813)

做这道题的时候时间正好是下午五点二十多,对应日本时间下午六点二十多,也就是类似拍照的时间,在实时飞机航线地图中正好看见有一架飞机在该处上空,起飞机场是 HND。通过飞机方向可以确定起飞机场就是 HND。然后找到每天大概这个时间从 HND 出发向北的飞机,通过尝试得到降落机场为 HIJ,航班号为 NH683。(也可以爆破,这道题的验题逻辑是将表单结果进行 base64,然后 GET 结果.txt,正确则 200 且里面是 flag,错误则 404)

flag:flag{Buzz_0ver_y0ur_h34d_and_4DSB_m19ht_111egal}


猜数字

这个小游戏需要做的事情非常简单:在 0 和 1 之间猜一个数字(精确到小数点后 6 位),并通过反馈的「大」还是「小」修正猜测,直至完全猜中。一次性命中的概率显然也是一百万分之一(和五边形的「嫩牛七方」达成了某种意义上的同构)——但从学霸室友手中借来的概率论与统计学笔记上万千公式的模样在思绪中一瞬而过,于是你默默祈祷着大数定理,虔诚地按下了提交的按钮。

题目给出了网页服务的 Java 源码。本来想着是爆破伪随机数,不过源码里用的是 SecureRandom,不能爆破。然后仔细看源码。发现了一些比较可疑的东西,明明比较的都是六位小数,是可以乘 1000000 然后判断整数相等的,但它偏要比较输入和两个小数的大小(是否不大于且不小于)。而如果输入是 NaN,则任何比较都是 False,也就让程序认为输入和预期相等了。

不过因为规定了小数,所以 NaN 在前端不能直接写入,需要手动 POST 到 /state,用一个任意数字试一下,可以在 DevTool 里捕获到 POST 数据格式。然后手动 POST 一个 <state><guess>NaN</guess></state> 再 GET 一下就能在返回数据中看到 flag:flag{gu3ss-n0t-a-numb3r-1nst3ad-……}


Flag 的痕迹

小 Z 听说 Dokuwiki 配置很简单,所以在自己的机器上整了一份。可是不巧的是,他一不小心把珍贵的 flag 粘贴到了 wiki 首页提交了!他赶紧改好,并且也把历史记录(revisions)功能关掉了。

「这样就应该就不会泄漏 flag 了吧」,小 Z 如是安慰自己。

然而事实真的如此吗?

(题目 Dokuwiki 版本基于 2022-07-31a “Igor”)

一个 Dokuwiki 框架搭的网站,目标是找到首页的修改。版本是最新的,搜不到啥漏洞。自己部署了一下玩玩,看起来 revisions 等功能关掉之后确实没法看修改记录了。而且题目是 external edit,也就是直接修改了文件,而没有通过网页编辑。

然后就读了读源码,搜了下 issue 看到了一个 revision 相关的 https://github.com/splitbrain/dokuwiki/issues/3576,里面提到了 ?do=diff,尝试访问 /doku.php?id=start&do=diff,确实能看到修改记录,其中 flag:flag{d1gandFInD_d0kuw1k1_unexpectEd_API}


安全的在线测评

传说科大新的在线测评系统(Online Judge)正在锐意开发中。然而,新 OJ 迟迟不见踪影,旧的 OJ 和更旧的 OJ 却都已经停止了维护。某 2022 级计算机系的新生小 L 等得不耐烦了,当即表示不就是 OJ 吗,他 10 分钟就能写出来一个。

无法 AC 的题目

为了验证他写的新 OJ 的安全性,他决定在 OJ 上出一道不可能完成的题目——大整数分解,并且放出豪言:只要有人能 AC 这道题,就能得到传说中的 flag。当然,因为目前 OJ 只能运行 C 语言代码,即使请来一位少年班学院的天才恐怕也无济于事。

动态数据

为了防止数据意外泄露,小 L 还给 OJ 加入了动态数据生成功能,每次测评会随机生成一部分测试数据。这样,即使 OJ 测试数据泄露,攻击者也没办法通过所有测试样例了吧!(也许吧?)

第一题就是使用 ./data/static.in 和 ./data/static.out 作为输入输出。而且也没有设置权限,所以直接读取 ./data/static.out 内容并输出即可。flag:flag{the_compiler_is_my_eyes_b18ad6f041}

第二题动态生成数据,而且设置了权限,用户不能读取,不知道该怎么做。


线路板

中午起床,看到室友的桌子上又多了一个正方形的盒子。快递标签上一如既往的写着:线路板。和往常一样,你“帮”室友拆开快递并抢先把板子把玩一番。可是突然,你注意到板子表面似乎写着些东西……看起来像是……flag?

可是只有开头的几个字母可以看清楚。你一时间不知所措。

幸运的是,你通过盒子上的联系方式找到了制作厂家,通过板子丝印上的序列号查出了室友的底细,并以放弃每月两次免费 PCB 打样包邮的机会为代价要来了这批带有 flag 的板子的生产文件。那这些文件里会不会包含着更多有关 flag 的信息呢?

给了一些 gbr 文件,搜了一下用 Gerbv 打开。发现 flag 相关内容在 F_Cu 这部分上,有一些圆环遮挡了,点击去掉就可以看见 flag:flag{8_1ayER_rogeRS_81ind_V1a}


Flag 自动机

Hackergame 2022 组委会为大家搬来了一台能够自动获取 flag 的机器。然而,想要提取出其中的 flag 似乎没那么简单……

一个使用 Win32 API 的窗口程序的逆向。夺取 flag 的按钮点不上。逆向一下,在 WinMain 函数里看到注册了一个事件处理函数在 0x401510 处。枚举了 msg 的值,也就是事件:

  • 1:即创建窗口,创建了三个按钮,一个是 “狠心夺取”,对应的 hMENU 为 3,一个 “放手离开”,hMENU 为 2,一个没有显示不管
  • 0x111:即点击,此时的参数 wParam(即 a3)为点击的按钮的 hMENU,当 a3 为 2 时退出,a3 为 3 时检查 lParam 是否为 114514,如果是则输出 flag 到文件中

因此可以直接在汇编里 patch 一下程序,将判断 a3 为 2 或 3 调换一下,然后再将判断 lParam 的 jz 变成 jnz。之后 Apply、运行点击放手离开即可输出 flag:flag{Y0u_rea1ly_kn0w_Win32API_……}


杯窗鹅影

说到上回,小 K 在获得了实验室高性能服务器的访问权限之后就迁移了数据(他直到现在都还不知道自己的家目录备份被 Eve 下载了)。之后,为了跑一些别人写的在 Windows 下的计算程序,他安装了 wine 来运行它们。

「你用 wine 跑 Windows 程序,要是中毒了咋办?」

「没关系,大不了把 wineprefix 删了就行。我设置过了磁盘映射,Windows 程序是读不到我的文件的!」

但果真如此吗?

为了验证这一点,你需要点击「打开/下载题目」按钮,上传你的程序实现以下的目的:

  1. /flag1 放置了第一个 flag。你能给出一个能在 wine 下运行的 x86_64 架构的 Windows 命令行程序来读取到第一个 flag 吗?
  2. /flag2 放置了第二个 flag,但是需要使用 /readflag 程序才能看到 /flag2 的内容。你能给出一个能在 wine 下运行的 x86_64 架构的 Windows 命令行程序来执行 /readflag 程序来读取到第二个 flag 吗?

第一个 flag 也很简单,直接读取 /flag1 输出就可以了。

第二个 flag 搞的时候试过 system、execl 啥的,一些命令都没办法执行,不知道该怎么办,不想研究了,开摆


剩下的写在下一篇里

「Hackergame 2022」#2 Writup 囤囤囤 0

https://blog.tonycrane.cc/p/4fd94ed.html

作者

TonyCrane

发布于

2022-10-27

更新于

2022-10-27

许可协议