Hgame week1 Writeup

本文最后更新于:2021年10月13日 下午

摘要
第一次参加CTF,小白视角参赛体验,从零开始学CTF

[TOC]

WEB

第一题Hitchhiking_in_the_Galaxy

Hitchhiking_in_the_Galaxy题目

这一题其实我看了蛮久的,好几题那没看出啥来,不过后来想到这题只有100分,那应该不是很难。果然是自己想太多!

题解

打开网页 http://hitchhiker42.0727.site:42420/ ,看到如下页面

image-20210204145549458

直接一个404,没啥信息,于是 F12 打开控制台看看有没有什么线索。header 里没看见什么奇怪的信息,只有页面源代码给出了一个 link 连接HitchhikerGuide.php

Hitchhiking_in_the_Galaxy_2

那就去看看那里有啥。

直接访问 http://hitchhiker42.0727.site:42420/HitchhikerGuide.php

image-20210204153031797

好家伙又来到404页面,但是注意到这次来到的是index.php。打开控制台,发现是302转向到了index.php页面。

image-20210204150658429

大胆猜测 maybe 访问方式不对,那把 GET 方式换成 POST方式试试。打开 Hackbar 插件,启用 POST请求,发送!有信息了!

image-20210204150958650

使用Infinite Improbability Drive方式?可能再说 User-Agent ?那 header 里加上 User-Agent 看看。

image-20210204151446650

好家伙,成功了。不过又说要从 Cardinal 过来,那么很 easy,header 里再加上 Referer参数。

image-20210204151717026

没毛病,成功了。又说要本地访问,那就在 header 里加个X-Forwarded-For参数,值为127.0.0.1

image-20210204151919486

GET!hgame{s3Cret_0f_HitCHhiking_in_the_GAl@xy_i5_dOnT_p@nic!}


第二题 Watermelon

简单上头的小游戏——真的上头,完了好久好久!

image-20210204165438863

不难发现,得到了 2000 分才能拿到 flag。

image-20210204165959619

也许能通过操作 js 来获得 flag。

通过审计页面源代码,很快定位到了一个叫project.js的文件,里面的变量 e 应该就是分数。

image-20210204170830357

发现里面有这样一段代码:

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?}


第三题 宝藏走私者

image-20210205002220955

这应该是一道关于HTTP走私的题目,目前知识学明白了,但操作上不知道哪出了问题一直没成功。

BUT!我好像多次搭上了顺风车

image-20210205002437221

flag如上图,具体搞明白了再补充吧。


第四题 智商检测鸡

image-20210205002822480

​ 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,稍等片刻:

image-20210205011507090

得到Flag hgame{3very0ne_H4tes_Math}


第五题 走私者的愤怒

我还没整明白


MISC

第一题 Base全家福

image-20210205011852749

这题蛮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

运行!

image-20210205012159739

得到Flag result: hgame{We1c0me_t0_HG4M3_2021} 啊哈原来是签到题

参考文章:

X-Forwarded-For 伪造Localhost


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!