站点图标 Wankko Ree's Blog

RoarCTF 2020 WriteUp

难度挺高(是我太菜)
这次被官方逼成了杂项大手子 被迫杂项AK,因为其他做了半天都不会。
队伍成绩:1066pt/3kill/42名/110有解/210报名
个人成绩:1066pt/3kill/1一血

Misc

签到题 [122pt 107killed]

WriteUp

打开容器,是个空白页面,查看源代码,发现<!-- /?url= -->

尝试file://协议,发现可以成功,读取页面源代码发现flag字符被ban。

因为file://协议本身支持%xx的形式,所以直接二次编码/?url=file:///%2566%256C%2561%2567,得到flag。

flag

flag{b75b5c4f7e558739758bee715788a811}

Hi_433MHz [317pt 43killed]

题目

小李同学刚刚学会了使用HackRF对无线电信号进行抓取,这天他抓到了一个奇怪的信号,你能帮他看看是怎么回事么?

WriteUp

下载附件,得到rf.s8,用Audacity导入原始数据,默认参数就行,发现42段类似如下的长短波。

一段一段手动敲下来,长1短0,得到42个9位二进制,发现每段的最后一位都是0,应当作结束标记使用,所以去掉,得到如下二进制。

01100110 01101100 01100001 01100111 01111011 00110010 00110101 01100011 00110010 00110001 01100010 00110000 01100100 00101101 00110110 01100001 00110001 00110001 00101101 00110100 00110011 00110001 00110010 00101101 00111001 00110111 00110001 01100010 00101101 00110100 00110010 00111000 01100100 00110000 00110001 01100011 01100100 01100011 00110101 00110011 00110100 01111101

010里粘贴自二进制了直接转文本就完事。

flag

flag{25c21b0d-6a11-4312-971b-428d01cdc534}

FM [627pt 10killed]

题目

小王同学刚刚入门了无线电安全领域,这天他用瀑布图软件录制了87-108MHz某一频点上的一段信号,你能找找看他听到了什么么?

这题有修过,本来题目描述不是这样子,而且交正确的flag也过不去。(好像是把上一题的数据复制过来了忘记改了?)

WriteUp

这题刚开始一脸懵逼,附件解压出来300MB+,之前也没做过无线电波的题目,只好临场Google,找到了Gqrx这个软件。

打开Gqrx,导入数据,参数我是这么填的。(能用就行)

导入后,将解调器模式选择WFM就行,单双声道啥的其实无所谓。

然后听flag就完事。(不过这机器朗读的语音包质量老差,1d7e分不清楚)

听了半天没听出来,而且最后一句特别快,所以我用右下角的录音功能把整段录下来放Au里去减慢速度听了,交的时候还是不对,用网上各种语音识别软件,得到的flag和我听的一样了,也还是不对。

之后给主办方发了个邮件,询问这题是不是flag设置错了,但是没回复。

那天下午主办方打电话过来说题目修了,让我重新交一下。(这应该不算捡个一血吧?主办方打电话应该是按后台记录的正确提交顺序来的,之后给我们学校另一队也打电话了)

flag

flag{82c83416-dadc-4947-80df-b84852b8f35d}

Web

HTML在线代码编辑器 [443pt 25killed]

题目

ps:flag在环境变量里

WriteUp

这题是公用容器,打开网页发现是个html提交的,然后抓包发现似乎存在文件上传,不过上传后的后缀名必为html,所以放弃走上传这条路。

然后又发现view这个api能够读取文件,就想着有没有可能存在任意文件读取,试了一下在文件名前面加个/当成读取根目录的文件,结果还是读出来了,所以应该也不行,判断后端应该是有在文件路径前面拼接上当前路径。

之后想了想,在源码里没找到页面给的demo源码,抓包发现也是个文件读取的api,测试发现卡时间戳卡的很死,误差超过几秒钟就不返回正常数据。

写了个py脚本进行发包,测试发现真的存在任意文件读取漏洞,但是关键的环境变量文件被卡waf了...比如说procenviron都过不去...猜测flag就在/proc/self/environ文件里,但不知道怎么绕过,没接出来,我怎么会这么菜

import time

import requests

timestamp = int(time.time())
ret = requests.post(url="http://139.129.98.9:30004/view",
              data={
                  "file": "./../../../../../etc/passwd", #/proc/self/environ
                  "time": timestamp
              },
              cookies={"session": "s%3Av8-3N_pSZUI9u3i6ogBerzZukz208Zqj.DDPBJCTOrrR%2Fdqu5PhgSuv2pU5nSjJxKbR0Ml7lr1os"},
              )
print(ret.text)

Reverse

slime_war [572pt 13killed]

WriteUp

打开附件发现是个游戏re题,本来以为改改人物数值通关就能拿flag,结果打通了boss啥也没有。

然后看程序提示,说要收集Secrets,才注意到通关的时候给了1个Secrets,于是就把这个数值改了几下,在改成4之后,通关变成了5,flag界面能显示了,但是是乱码...猜测是要真收集齐5个Secrets才行。

然后就去反编译看源代码,找到了13张地图(1入口10层1boss1隐藏副本)

因为改游戏数值时发现boss地图的地图编号是11,入口是0,那隐藏副本应该是12,改了之后确实飞到隐藏副本去了。然后出副本时,Secrets+1。

之后就迷惑了,根本找不到哪里还有3个Secrets

于是又去ida里看代码,全局查找Secrets的变量名发现了踩T会触发Secrets+1,但是存在条件,没看明白条件啥意思,变量太多了,另外两处Secrets+1的条件也没看明白,最后放弃...(可能盯着看几天把所有变量名改成语义化字符了说不定能看明白)


The End
退出移动版