第一关
这道题的题目是《饥饿游戏》,一进游戏果然是好莱坞大片的即视感:
可以看到场面非常宏伟壮观,而我们的英雄人物就是乔布斯
。
看一下游戏提示:
Connected
Login OK
Use [↑↓←→] ot move around, [space] is the function key.
也就是说:方向键可以移动英雄,空格键是用来触发功能的。
把英雄移动到门的旁边,按空格键可以过关。
第二关
地图里有两扇门:
关卡提示:
There is a locked door in front of you, but you don’t have the key.
走到左边的门旁边按空格键,看到提示:
Find key to open this door!
看来需要钥匙才能打开左边的门,但是地图里没看到有钥匙。
在网页源码里搜索关键字Find key
,可以在game.js
文件里发现以下代码:
1 | function onnextdoor() { |
搜一下onfackdoor()
函数,发现按空格就直接调用了,所以是找不到钥匙来开启的。
而onnextdoor()
函数的作用是向服务器发送数据进入下一关,所以在浏览器的控制台里执行onnextdoor()
即可过关。
还有一种方法是修改英雄的坐标,这样英雄就可以穿墙
了,然后走到右边的门按空格键。
第三关
地图里有两颗树:
游戏提示:
Hold [space] to cut the tree. When you get 9999 wood, a wooden pickaxe will be automatically generated.
在树的旁边按住空格键可以砍树,获得9999块木材会自动获取一根木制镐。
走到树边砍树:
Cutting Tree…
You get 3 woods,total 3
You get 5 woods,total 8
……
按住一秒会得到一个木材,手动砍树的话肯定是行不通的,看一下js文件,发现如下代码:
1 | if (level == 2 && users[heroname].x < 800) { |
tmp
变量是两次按键之间的毫秒数,所以可以轻易伪造砍了10000颗树,在浏览器控制台输入:
1 | data = JSON.stringify([msg('wood', { |
执行后游戏提示:
You get 10000 woods,total 10008
Get the wooden pickaxe!!!
走到门边通往下一关。
第四关
地图里有两堆钻石:
游戏提示:
Mine by hitting [space], When you get 9999 diamonds,the diamond sword will be automatically generated.
猛击空格键,得到9999颗钻石会获得一把钻石剑。
在游戏源码里可以发现以下代码:
1 | if (level == 3 && users[heroname].x < 800) { |
按照第三关的方法在浏览器控制台执行:
1 | data = JSON.stringify([msg('diamond', { |
游戏提示:
Mining too fast, manager kicked you out.
Connection lost
挖掘太快,被服务器踢出去了。
应该是数量太多了,经过试验,每次挖掘的最大数量是50,所以用循环执行200次就行了:
1 | for (var i = 0; i <= 200; i++) { |
执行结果:
Get 50 diamond,total 50
Get 50 diamond,total 100
Get 50 diamond,total 150
……
Get 50 diamond,total 9950
Get 50 diamond,total 10000
Get the diamond sword!!!
通过门可以通向下一关。
第五关
终于要打BOSS了:
游戏提示:
At last, the final level! Wave your diamond sword and beat the BOSS.
PS: Short-range weapons can only hurt other players(your hp +1) but cannot harm the BOSS.
PS: Cause 15 point damages to the BOSS to get the flag
PS: Or kill 5 players to get the flag
近距离攻击的武器只能攻击到别的玩家,打不到远处的BOSS。攻击到别的玩家时,别的玩家的hp会减1,自己的hp会加1。
有两种过关方法,一是让BOSS掉15滴血,二是杀死5个玩家。
BOSS是有瞬移技能的,满地图顺机传送,而且隔两三秒就攻击玩家一次:
Attacked by boss
Attacked by boss
Attacked by TFBoys
Attacked by boss
英雄不但会受到BOSS攻击,还会受到其它玩家的攻击,而英雄只有10滴血,往往坚持30多秒就挂了。
地图里有个神秘的箱子和一把远程攻击的弓箭,其实这些都是骗人的,捡物品的时候会调用以下代码:
1 | function onselfkill(argument) { |
看一下按功能键时的代码:
1 | if (level == 4) { |
代码向服务器发送了一个攻击事件和英雄的当前坐标,服务器应该是判断这个坐标周围有没有攻击对象的。如果把这个坐标改成BOSS的坐标的话,那么就可以攻击到BOSS了。
查看js代码,发现有一个boss
变量,所以可以在控制台执行以下代码:
1 | function attact() { |
执行后可以得到过关的key:
Attack:boss,total 1
Attack:boss,total 2
Attacked by boss
Attack:boss,total 3
Attack:boss,total 4
Attack:boss,total 5
Attacked by boss
Attack:boss,total 6
Attack:boss,total 7
Attacked by boss
Attack:boss,total 8
Attack:boss,total 9
Attack:boss,total 10
Attacked by boss
Attack:boss,total 11
Attack:boss,total 12
Attack:boss,total 13
Attacked by boss
Attack:boss,total 14
Attack:boss,total 15
SSCTF{2b3d41dd4b7911dc0fe683d1a0d977ef}