摘要
第一次参加CTF,小白视角参赛体验,从零开始学CTF
[TOC]
WEB
第一题Hitchhiking_in_the_Galaxy
这一题其实我看了蛮久的,好几题那没看出啥来,不过后来想到这题只有100分,那应该不是很难。果然是自己想太多!
题解
打开网页 http://hitchhiker42.0727.site:42420/ ,看到如下页面
直接一个404,没啥信息,于是 F12 打开控制台看看有没有什么线索。header 里没看见什么奇怪的信息,只有页面源代码给出了一个 link 连接HitchhikerGuide.php
那就去看看那里有啥。
直接访问 http://hitchhiker42.0727.site:42420/HitchhikerGuide.php
好家伙又来到404页面,但是注意到这次来到的是index.php
。打开控制台,发现是302转向到了index.php
页面。
大胆猜测 maybe 访问方式不对,那把 GET 方式换成 POST方式试试。打开 Hackbar 插件,启用 POST请求,发送!有信息了!
使用Infinite Improbability Drive
方式?可能再说 User-Agent ?那 header 里加上 User-Agent 看看。
好家伙,成功了。不过又说要从 Cardinal 过来,那么很 easy,header 里再加上 Referer
参数。
没毛病,成功了。又说要本地访问,那就在 header 里加个X-Forwarded-For
参数,值为127.0.0.1
。
GET!hgame{s3Cret_0f_HitCHhiking_in_the_GAl@xy_i5_dOnT_p@nic!}
第二题 Watermelon
简单上头的小游戏——真的上头,完了好久好久!
不难发现,得到了 2000 分才能拿到 flag。
也许能通过操作 js 来获得 flag。
通过审计页面源代码,很快定位到了一个叫project.js
的文件,里面的变量 e 应该就是分数。
发现里面有这样一段代码:
1 2 3 4 5
| gameOverShowText: function (e, t) { if(e > 1999){ alert(window.atob("aGdhbWV7ZG9feW91X2tub3dfY29jb3NfZ2FtZT99")) } },
|
atob()
方法用于解码使用 base-64 编码的字符串,那么aGdhbWV7ZG9feW91X2tub3dfY29jb3NfZ2FtZT99
应该就是 base-64 编码的字符串。解码一下
GET!hgame{do_you_know_cocos_game?}
第三题 宝藏走私者
这应该是一道关于HTTP走私的题目,目前知识学明白了,但操作上不知道哪出了问题一直没成功。
BUT!我好像多次搭上了顺风车
flag如上图,具体搞明白了再补充吧。
第四题 智商检测鸡
100道定积分计算,做完给flag。服务器通过临时session来识别用户,因此手算必然不可能。那么试试自动计算?
瞬间想到Python,打算试试 selenium 自动化。但是对于分析了页面源码后,我发现以我现有水平读取积分上下限的值和程式有难度(负号在单独的标签里)。所以打算先收算几道看看有没有啥规律。
然后在微软数学手机软件的帮助下,做了十几道题,发现规律——积分下限都是负整数,上限都是正整数,积分式子都是 Ax+B
的形式,其中 A 和 B 都为正整数
那就很 ez 了,编写Python代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| from time import sleep //导入sleep包来使用sleep函数 from selenium import webdriver //导入webdriver自动化组件 from sympy import * //sympy里的integrate函数用于定积分计算
wd = webdriver.Chrome(r'chromedriver.exe') //定位chrome浏览器自动化的驱动程序(因为我使用chrome) wd.get('http://r4u.top:5000/') //打开网页窗口,自动访问该网页 sleep(1) //我怕网页没加载好就开始寻找元素,那必报错,所以让程序sleep一会
for i in range(100): //100道题,循环100次 try: inPutBox = wd.find_element_by_id('answer') //定位答案输入框 clickBtn = wd.find_element_by_css_selector('.btn.btn-primary') //定位验证答案框 a = "-" + wd.find_element_by_css_selector('#integral > math > mrow > msubsup > mrow:nth-child(2) > mn').text //积分下限 b = wd.find_element_by_css_selector('#integral > math > mrow > msubsup > mrow:nth-child(3) > mn').text //积分上限 c = wd.find_element_by_css_selector('#integral > math > mrow > mn:nth-child(3)').text //积分式 Ax+B 中的 A d = wd.find_element_by_css_selector('#integral > math > mrow > mn:nth-child(6)').text //积分式 Ax+B 中的 B a = int(a) //字符串转数字 b = int(b) //字符串转数字 c = int(c) //字符串转数字 d = int(d) //字符串转数字 x = symbols('x') //x为积分变量 result = str(integrate(c * x + d, (x, a, b))) //计算答案,同时转换为字符串格式 if '/' in result: //这里很重要,定积分计算结果不是用小数表示的,比如 1.5 是用 3/2 表示的,所以要处理一下 eq = result.split('/') result = float(eq[0]) / float(eq[1]) result = str(result) //用split函数把分子分母取出来,转换成浮点数除一下,就得到小数了,最后转换成字符串 inPutBox.send_keys(result) //向输输入框中输入答案 clickBtn.click() //自动点击验证答案切换到下一题 finally: //没学过python的,本来想试一下try,然后就出现了没啥用的try-finally结构 sleep(1) //等下一题加载出来 inPutBox.clear() //清空输入框
|
Ctrl
+Shift
+F10
,稍等片刻:
得到Flag hgame{3very0ne_H4tes_Math}
第五题 走私者的愤怒
我还没整明白
MISC
第一题 Base全家福
这题蛮easy的,都说了 Base全家福 那应该就是 Base混合编码的解码,直接用 python 解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import base64
f = open('base.txt') content = "" for i in f.readlines(): content = content + i.replace('\r', '').replace('\n', '').replace('\t', '') f.close() while True: try: content = base64.b64decode(content).decode() except: try: content = base64.b32decode(content).decode() except: try: content = base64.b16decode(content).decode() except: print('result: ', content) break
|
运行!
得到Flag result: hgame{We1c0me_t0_HG4M3_2021}
啊哈原来是签到题
参考文章:
X-Forwarded-For 伪造Localhost