Blog

PKU GeekGame 2nd Writeups

2022-11-27

#GeekGame

这周过于摆烂加上真的菜,只做了几题

签到

跟上一届的套路完全一致,打开PDF,Ctrl + A 全选拷贝出来就能阅读了,建议用上等宽字体便于阅读

直接用我最常用的PDF浏览器 Microsoft Eege 会提示包括拷贝内容在内的部分操作权限受到了限制,但 Chrome 并没有这种限制,直接全选拷贝即可

别急 别急
WELCOME ABOARD,
ALL PLAYERS! GO TO
GEEKGAME.PKU.EDU.CN
AND SUBMIT THE FLAG:
fa{ecm_oPUGeGmV!
lgWloet_K_ekae2}

flag{Welcome_to_PKU_GeekGameV2!}

小北问答

我懒,拿了 flag1 就收工了

  • avbv转换的脚本随处可见,比如知乎链接,由于我恰好装了这类插件,所以直接打开就看到转换好的av号了
  • 支持webp的版本号很好找,直接Google搜索webp firefox version,就可以得到版本号是 65
  • DOI编号真不知道,简单搜索没看到,所以没管
  • 包名 cn.edu.pku.pkurunner
  • 看了一圈上一届的题解,没有直接说要多少钱的,跳过
  • MAC地址定位我真不知道,还好第二阶段给了地址直接搜索得到80304
  • Host 头估计想考的是 Punycode,不过浏览器的地址栏会提供转换,所以直接将 http://ctf.世界一流大学.com 粘贴到地址栏再拷贝出来就得到了 http://ctf.xn--4gqwbu44czhc7w9a66k.com/
  • 大素数的判定可以参考 知乎链接,然后赌运气就可以了,我懒得猜就没管

企鹅文档

注意到这题很简单的时候已经是二阶段了白白亏了两百分

直接打开F12刷新页面,在Network标签下搜索关键词 机密flag 可以得到两三个结果,其中有一个是jsonp,还有一个是json,前者组成了表格内容的前半部分,后者组成了后半部分

提取前者 JSON.clientVars.collab_client_vars.initialAttributedText.text[0][3][0].c[1] 路径下的内容与后者 JSON.data.initialAttributedText.text[0][0][0].c[1] 下的内容合并,代码差不多就是

const a = JSON.parse('前半段')
const b = JSON.parse('后半段')

console.log(Object.values(a).map(item=> item[2][1]).join('')+Object.values(b).map(item=> item[2][1]).join(''))

最终得到一个地址 '通过以下链接访问题目机密flag:https://geekgame.pku.edu.cn/service/template/prob_kAiQcWHobsBzRJEs_next机密flag链接已经受到保护,只允许出题人访问'

打开以后得到一个har文件和一张参考图

企鹅文档

企鹅文档

直接在har文件中搜索图上的关键字 Below is your flag,只会有一个结果,将结果所在的json内容的 JSON.data.initialAttributedText.text[0][3][0].c[1] 路径下的内容全部拷贝出来供后续使用

根据截图可以看出纯粹是由色块展示flag的,而腾讯文档的特性是没有内容的块不会出现,所以只需要知道表格的长宽就可以手工渲染了,而路径 JSON.data.initialAttributedText.text[0][3][0].c[0] 里面的内容的 10225 就分别是宽和长了,需要注意的是这个坐标是从0开始的 后面就是简单的跑起来看图了

const tmpContent = Object.keys('那一大堆东西')
let content = ''
for (let index = 0; index < 11 * 226; index++) {
    if (index % 11 === 0) {
        content += "\n"
    }
    if (tmpContent.includes(String(index))) {
        content += '*'//我随便填的,反正找个宽度合适的字体对后面看图很重要
    } else {
        content += ' '
    }
}
console.log(content)

得到一个特别长的 ASCII art,慢慢读就得到了

flag{ShouldBeSponsoredByTencent}

企业级理解

其实这个flag1我是混的,看到提示就给 /admin 后面加个斜杠绕过了登录,在管理页面中随便发内容发现跳回未登录,于是给post的路径 /admin/query 末尾也加上斜杠,构造了一个请求

# 请自行在 xxxxxxxx 换成自己的容器
## 其实 value 的值在flag1不重要,可以直接忽略
curl 'https://prob08-xxxxxxxx.geekgame.pku.edu.cn/admin/query/' --data-raw 'type=PKU_GeekGame' --compressed

得到flag1 {"type":"PKU_GeekGame","value":"flag1{8a97cd0b-adec-4e63-bd46-3e6c60ea9d78} 恭喜你发现flag1,还有其他flag等待你发现哦"}

结束

这周把太多的时间和精力花在YouTube和金毛庄园的 辛西米托龙舌兰酒 上面,还顺便把用node重写的 twitter monitor v3 的核心和大部分服务开源,外加很多题目真的不会,除了签到以外都是在最后两天深夜做的

总分 179,总排名 235
Tutorial 73 + Web 106

评论区