游戏地址:http://fun.coolshell.cn/
一个很有意思的小游戏,也很费脑子的说TAT
本关地址:http://fun.coolshell.cn/first.html
进去以后,发现一些乱七八糟的东西,下面一行提示:My brain has been fucked,通过BaiDu得知这是一种编程语言,称之为Brain Fuck(我不会说当我看到这个着实汗了一把),然后在网上找到编译器
编译器代码
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#include <stdio.h>
int
p, r, q;
char
a[5000], f[5000], b, o, *s=f;
void
interpret(
char
*c)
{
char
*d;
r++;
while
( *c ) {
switch
(o=1,*c++) {
case
'<'
: p--;
break
;
case
'>'
: p++;
break
;
case
'+'
: a[p]++;
break
;
case
'-'
: a[p]--;
break
;
case
'.'
:
putchar
(a[p]);
fflush
(stdout);
break
;
case
','
: a[p]=
getchar
();
fflush
(stdout);
break
;
case
'['
:
for
( b=1,d=c; b && *c; c++ )
b+=*c==
'['
, b-=*c==
']'
;
if
(!b) {
c[-1]=0;
while
( a[p] )
interpret(d);
c[-1]=
']'
;
break
;
}
case
']'
:
puts
(
"UNBALANCED BRACKETS"
),
exit
(0);
case
'#'
:
if
(q>2)
printf
(
"- - - - - - - - - -/n%*s/n"
,*a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,
"^"
);
break
;
default
: o=0;
}
if
( p100)
puts
(
"RANGE ERROR"
),
exit
(0);
}
r--;
}
main(
int
argc,
char
*argv[])
{
FILE
*z;
q=argc;
if
(z=
fopen
(argv[1],
"r"
)) {
while
( (b=
getc
(z)) > 0 )
*s++=b;
*s=0;
interpret(f);
}
}
|
把该编译器代码存为test.c
然后执行
1
|
gcc
test
.c -o
test
|
得到的test即为该语言编译器,编译的时候有俩Warning,很抱歉我无视了这个Warning…
然后将Brain Fuck的代码存为test.bf
1
|
++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<>>>>>>>>>>>>+++.---<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>--.++<<<<<<>>>>>>>>>>>>>.<<<<<<<<<<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<.
|
然后在shell下执行即可得到答案
1
|
.
/test
test
.bf
|
如图,得到第一关地址
本关地址:http://fun.coolshell.cn/welcome.html
首先进去看到一个序列
2,3,6,18,108,?
然后上面给出了算法X * Y,观察序列可得知后一个数字是前两个数的积,于是得出?地方为18*108=1944
打开http://fun.coolshell.cn/1944.html可以看到X已经成了红色,同时得到另一个提示“其中一个答案为1944”,即X=1944
然后找寻另一个数字,看到另一个提示
What is the meaning of life, the universe and everything?
扔到Google中,找到Wiki中的一个提示
根据道格拉斯·亚当斯的小说《银河系漫游指南》,42是“生命、宇宙以及任何事情的终极答案”。因此,42也经常被用来向这一作品致敬,例如:
您若在Google输入the answer to life, the universe, and everything,Google会直接回答42——而且还是用Google计算器算出来的。
可以得到Y=42
输入http://fun.coolshell.cn/42.html也可以验证这一点,然后X*Y=1944*42=81648
得到下一关地址81648.html
本关地址:http://fun.coolshell.cn/81648.html
首先进去,一个硕大的键盘,不过这个键盘貌似有些问题,键盘上一些键和现在用的qwerty键盘有些出入,该图上有个超链,得知该种键盘被称之为Dvorak键盘,是为了更快的提高打字速度而设计出来了,通常是程序猿和打字猿使用率较高(隐隐感觉这两个职业没差别….)
先把Dvorak键盘的布局换成QWERTY的布局,如图
黑色为Dvorak布局,红色为QWERTY布局
1
2
|
//这是给出的代码
macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+
|
1
2
|
//这是QWERTY布局下代码
main() {
printf
(&unix[
"\021%six\012\0"
],(unix)[
"have"
]+
"fun"
-0x60);}
|
把该代码编译之后得到一个程序,运行返回结果unix,过关,如图
本关地址:http://fun.coolshell.cn/unix.html
首先映入眼帘的是一个二维码,使用二维码识别工具可得到下面提示的码表,如图
得到字符转换码表为
1
|
[abcdefghijklmnopqrstuvwxyz] <=> [pvwdgazxubqfsnrhocitlkeymj]
|
然后转换字符,使用python语言,源代码为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#Thanks For Code by Mutalisk
content_de
=
'''Wxgcg txgcg ui p ixgff, txgcg ui p epm. I gyhgwt mrl lig txg ixgff wrsspnd tr irfkg txui
hcrvfgs, nre, hfgpig tcm liunz txg crt13 ra "ixgff" tr gntgc ngyt fgkgf.'''
.lower()
content
=
''
keychr_de
=
'pvwdgazxubqfsnrhocitlkeymj'
keychr
=
'abcdefghijklmnopqrstuvwxyz'
for
s_chr
in
content_de:
if
s_chr
in
keychr_de:
content
=
content
+
keychr[keychr_de.index(s_chr)]
else
:
content
=
content
+
s_chr
print
content
|
转换后截图如下
1
|
echo
'shell'
|
tr
'[A-Za-z]'
'[N-ZA-Mn-za-m]'
|
本关地址:http://fun.coolshell.cn/furyy.html
1
|
([A-Z])([0-9])[a-z](\2)(\1)|([0-9])([A-Z])[a-z](\6)(\5)
|
一开始觉得这个正则很牛逼…因为不懂··
在后来学习正则的过程中,逐渐知道了这句的意思
可以断成两部分,|是或,根据要求得出,回文中间为信息,组成元素分两种情况,
1、5 | 2、4 | 3 | |
情况一: | 大写字母 | 数字 | 小写字母 |
情况二: | 数字 | 大写字母 | 小写字母 |
于是得出下列正则
1
2
3
4
5
6
|
([A-Z])([0-9])[a-z](\2)(\1)
//第一个元素匹配A-Z,第二个元素匹配0-9,中间匹配a-z,第四个元素和第二个一样,第五个和第一个一样
|
//或
([0-9])([A-Z])[a-z](\6)(\5)
//第一个元素匹配0-9,第二个元素匹配A-Z,中间匹配a-z,第四个元素和第二个一样,但是在整个正则中,情况2的第四位是和正则中的第6个元素相配的,故为\6,第五个和第一个一样,为\5,原因同前
|
然后把html中注释掉的东西拉到http://tool.oschina.net/regex匹配一下,得出结果如图
1
2
3
4
5
6
7
8
9
10
|
共找到 9 处匹配:
E1v1E
4FaF4
9XrX9
O3i3O
0MaM0
4GbG4
M5l5M
0WeW0
Y0s0Y
|
然后观察网页主体的回文,可以看到cat来自于回文中央的那个字符串的拼接,把刚才得出的匹配中间字符拼接出来即为key:variables
本关地址:http://fun.coolshell.cn/variables.html
本页提示:继续跑,你会找到你要的结果
点击图片,进入一个url,http://fun.coolshell.cn/n/2014,页面返回一个数字,既然提示是继续跑,里面唯一可控的只有url后面的数字,那么就去跑这个数字,这个页面显示的数字放到url进行下次循环
用seraph写了个小程序跑了一下,秒出
1
2
3
4
5
6
7
8
9
10
11
|
dim a
function main
start =
"2014"
a = GetHTTP(
"http://fun.coolshell.cn/n/"
&start)
Print(a)
for ForCount = 1 to 999999
CStr
(a)
a = GetHTTP(
"http://fun.coolshell.cn/n/"
& a )
Print(a)
next
end function
|
如图,得出key为tree
本关地址:http://fun.coolshell.cn/tree.html
看图就可以知道,这特么是二叉树….
花了3个小时,对这个树进行了复原,复原图如下
1
|
echo
U2FsdGVkX1+gxunKbemS2193vhGGQ1Y8pc5gPegMAcg=|openssl enc -aes-128-cbc -a -d -pass pass:zWp8LGn01wxJ7
|
本关地址:http://fun.coolshell.cn/nqueens.html
历史上著名的N皇后问题,给出的范例为8皇后,求9皇后,code为从右往左,皇后依次在纵坐标上的顺序
在网上找了一份N皇后算法代码,可得到9皇后问题有352个解,然后修改了一下代码,可以直接生成出题目所要求的code,得到352个code
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/**
* n皇后问题
* date : 2010-3-12
* author : lee
* change :LinE
* change date:2014-8-4
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define QUEEN 9 // the number of the queen
#define INITIAL -10000 //defines the initial value of the board
//container
int
a[QUEEN];
//check if the queen can be placed on the position
int
valid(
int
row,
int
col);
//initialize the board
void
clear();
//print the result
void
print();
//run the n-queen program
void
queen();
int
main(
void
)
{
clear();
queen();
return
0;
}
void
clear()
{
int
*p;
for
(p = a; p < a + QUEEN; ++p) {
*p = INITIAL;
}
}
void
print()
{
int
i, j,l;
for
(i = 0; i < QUEEN; ++i) {
for
(j = 0; j < QUEEN; ++j) {
if
(a[i] != j) {
//printf("%c ", '.');
}
else
{
l=j+1;
printf
(
"%d"
,l);
//printf("%c ", '#');
}
}
}
printf
(
"n"
);
//printf("--------------------------------------------n");
}
int
valid(
int
row,
int
col)
{
int
i;
for
(i = 0; i < QUEEN; ++i) {
if
(a[i] == col ||
abs
(i - row) ==
abs
(a[i] - col))
return
0;
}
return
1;
}
void
queen()
{
int
n = 0;
int
i = 0, j = 0;
while
(i < QUEEN) {
while
(j < QUEEN) {
if
(valid(i, j)) {
//test if the queen can be placed on the position
a[i] = j;
//place the queen on the next line
j = 0;
break
;
}
else
{
// if not, check the next position
++j;
}
}
if
(a[i] == INITIAL) {
//if the current queen can't find its place
if
(i == 0)
// and this is the first line ,then program end
break
;
else
{
//else backtrack
--i;
j = a[i] + 1;
a[i] = INITIAL;
continue
;
}
}
if
(i == QUEEN - 1) {
//already got a solution, print the result
//printf("answer %d : n", ++n);
print();
// _sleep(600);
j = a[i] + 1;
a[i] = INITIAL;
continue
;
}
++i;
// go on to place the queen on the next line if has any more
}
}
|
1
2
|
gcc
queen.c -o queen
.
/queen
>code.txt
|
然后编写一个php脚本,来对所得的解法爆破
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php
$f
=
fopen
(
"/root/Desktop/test/code.txt"
,
"r"
);
$passwd
=
"zWp8LGn01wxJ7"
;
$hash
=
"e48d316ed573d3273931e19f9ac9f9e6039a4242"
;
while
(!
feof
(
$f
))
{
$code
=
fgets
(
$f
);
if
(sha1(
$passwd
.
$code
)===
$hash
) {
//因为fgets自带了一个换行符,故这里不需要再添加"n"了
echo
$code
;
}
}
fclose(
$f
)
?>
|
得出结果为953172864,如图
本关地址:http://fun.coolshell.cn/953172864.html
感觉这题和Excel关系不大,主要还是一个幂运算,这个类似于16进制转10进制运算,可以把它看成26进制转10进制,首先求出来式子当中各个字母在字母表中的位置
C—-3
O—-15
L—-12
S—-19
H—-8
E—-5
然后列出算法,计算出COOLSHELL和SHELL在10进制下的数字
算法可以参考http://www.cnblogs.com/lavezhang/archive/2012/05/14/2499000.html这里来查看
1
2
|
COOLSHELL = 3*26^8+15*26^7+15*26^6+12*26^5+19*26^4+8*26^3+5*26^2+12*26^1+12*26^0 = 751743486376
SHELL = 19*26^4+8*26^3+5*26^2+12*26^1+12*26^0 = 8826856
|
写了一个C语言小程序,发现数值太大溢出了,换成长整之后还是溢出了TAT,后来朋友让我把公式丢谷歌,果然万能的Google帮我计算出了答案
1
2
3
4
5
6
7
8
9
10
11
12
|
//个位计算
85165 / 26 = 3275
85165 % 26 = 15
//O
//十位计算
3275 / 26 = 125
3275 % 26 = 25
//Y
//百位计算
125 / 26 = 4
125 % 26 = 21
//U
//千位计算
4 / 26 = 0
4 % 26 = 4
//D
|
最终结果为DUYO,后来自己写了个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
33
34
35
36
37
|
import
math
COOLSHELL
=
3
*
26
*
*
8
+
15
*
26
*
*
7
+
15
*
26
*
*
6
+
12
*
26
*
*
5
+
19
*
26
*
*
4
+
8
*
26
*
*
3
+
5
*
26
*
*
2
+
12
*
26
*
*
1
+
12
*
26
*
*
0
SHELL
=
19
*
26
*
*
4
+
8
*
26
*
*
3
+
5
*
26
*
*
2
+
15
*
26
*
*
1
+
15
*
26
*
*
0
print
'COOLSHELL='
,COOLSHELL
print
'SHELL='
,SHELL
NUM
=
int
(COOLSHELL
/
SHELL)
+
1
print
'COOLSHELL / SHELL='
,NUM
temp
=
NUM
a
=
temp
/
26
b
=
temp
%
26
c4
=
chr
( b
+
64
)
print
'a='
,a
print
'b='
,b
print
c4
temp
=
a
a
=
temp
/
26
b
=
temp
%
26
c3
=
chr
( b
+
64
)
print
'a='
,a
print
'b='
,b
print
c3
temp
=
a
a
=
temp
/
26
b
=
temp
%
26
c2
=
chr
( b
+
64
)
print
'a='
,a
print
'b='
,b
print
c2
temp
=
a
a
=
temp
/
26
b
=
temp
%
26
c1
=
chr
( b
+
64
)
print
'a='
,a
print
'b='
,b
print
c1
print
'Pass is :'
,c1
+
c2
+
c3
+
c4
|
本关地址:http://fun.coolshell.cn/DUYO.html
首先看提示,提示意思为,如果你能找到上述图片关系,那么这关将会很容易
然后把图片DOWN下来,左边是猪圈(pigpens),右边是共济会的标志(Freemasonry)
然后以这二者为关键词去搜索,得到一个关联的词语,猪圈密码,然后按照猪圈密码的翻译图对照下面的密文译成明文即可
该图为共济会的猪圈密码密文对照表
本关地址:http://fun.coolshell.cn/helloworld.html
一开始不知道有隐藏关卡一说,直到该游戏作者自己说有隐藏关卡
其它
1)本次活动中,有一个隐藏关卡,还没有人找出来。要能达到隐藏关卡,需要完成所有的题目。
2)活动的通关页是HelloWorld,这意味着——这仅仅是个开始。
最后感谢大家为这个活动付出的时间!
在完成之后,硕大的电源Icons在屏幕上,既然说了有隐藏关卡,那首先就是吧这个icons下到本地,然后用记事本打开,打开之后发现这么一些数据
从开始做到整个完成花了大概1天的时间,收益颇多,同时也感觉到自己的底子太弱了…好多加密解密都是在别人的帮助之下完成的,二叉树部分更是耗费大量时间进行了树还原(其实这个题用程序分分钟解出),不过总体来说收获是大于付出的,希望以后能更多地去参与这种比赛,去学习更多的东西…..