西邮Linux小组免试题揭秘
还记得东京大学情报理工学系的招生海报吗?只要答对了问题,然后你就被录取了。当时可火了,人人和微博疯狂转载。
如今西邮Linux小组也搞了个这样题目,只要你能答对,就能免试进入西邮Linux小组!感觉挺好玩,遂挑战一把。
题目原文在这里:http://www.xiyoubbs.com/thread-81454-1-1.html
第一关
题目
题目就是一段密文:
0011011101111010101111001010111100100111000111000000000000000011100110111011010111100011010100101111011000000000000000000000000000000000000000000000000000000000010011100000000000000000000000000000000000000000000000000000000001011110001100000101000101001101000000000001000110011001000010001010011010000010100110011011100011000101100001110010010001011010011100010011010111011001000011110111010110101101101110011100111111110101000010110111001110001001011101111011010010011000001110111001111100010100100100010010110101010101100001000101011001110010101111101100100100000101011100000011011001010101000110111101011001010101000001101001000111000011100101101111010001010001100011110110000011111010100101111100101010000111010111001110111011011110100100001001110001111010110100111001110000111111100100010011010001011110000101010000110101000111100101111100110101000100111101101100000110111111000111100001010111000101100010011111100111101110111110111111001111010010000100010100000101011101011010001010111011110111011001000001111100110100111101011011111001101110000110101101010011101010101001000011011110111111001111000010000110010110101100100010110110101000110110111001100011010011111001110110111101100000101001011101110011111101010110101100010001011001010000100100100000001010110111111101101111001000011010111001101110100110000101110110100110101100100011100011110100111011010001001010110110101011010111111001001110101001011110010010001011101000010001101010001110100001011000001110011000100001110110101001000101110001100001010000101100101101111100101110011001011000111011010111010000010101111110001100001110011110010011110110101100110011101101110001101110110001101101001001011110110101101010110111111100111110000111010010111111110001010111000010100000000001100110001101111011001010101001100100101101010011110000010000100111000011110111001001100110101101101110101100111001101000010010101000100101111010101000000100011000101100110011111010101111000110100010110011000000110000000000110110001111011110001110011101000100100010010111110000001001000100100011011100110001011111101101011110100101101000010011010100110101100110001010011101111011101101111010000110110100111101100101110001100010100111111101101011110001101001111110010000000000000000000000010000010000000110000000000000000100001001100000001111011000000000000001110000101100000001000000000000000100100011000000110000000100000001000001010101110100000000000000000000000100000000000011001000001000000010000000000000100000001010000000011000110001111011110010111100101100000000000000000000010100000001000100010000111100000000011000110000000001101111000000000110010000000000011001010000000000101110000000000110001100000000000000000000000000010100000010100000000100000000000000000011101100100000001000010110000100100000110011100000000100010101000001100000000100000000001000001000000010110100100000010000000000000000
分析
一大串01代码,二进制也是01代码,其中可能有某种关联,首先转换成ASCII代码看看吧。
在线的工具是最方便的!http://home.paulschou.net/tools/xlate/。把那一串01代码贴进第二个框,单击下面的“DECODE”,瞬间就转完了:
注意观察一下第一个文本框,前两个字母是“7z”,7z是什么?7z不就是7zip压缩格式吗?难道这是一个7z的压缩包?有可能!再找个7z压缩包打开看看,vim -b + 文件名
打开一个7z格式的压缩包,输入: %!xxd
查看其16进制编码:
再和上面的图片的第三个框的编码比较一下,发现了什么?前面的37 7a bc af 27 1c 00 03
完全是一样的!这不是巧合,这足以让我们确信这就是一个7z的压缩包,下面的任务,就是将压缩包还原,用python写了个小程序:
#!/usr/bin/env python
#coding=utf-8
data = open('data.txt')
out = open('out','a')
while True:
d = data.read(8)
if len(d) != 8:
break
out.write(chr(eval("0b%s"%d)))
data.close()
out.close()
data.txt
里面放的是那以长串01代码,执行程序后得到一个名字为out
文件,用file out
命令查看文件类型,显示:out: 7-zip archive data, version 0.3
。果然没用猜错!接下来就是解压这个文件了:7z e out
,然后,我们就会发现目录下多了一个code.c
文件,内容如下:
#define ____ puts
#define __ main
#define _ int
#define _______ char
#define _____ {
#define ______ }
_ puts (_______ *); _ __() _____ ____ (
"\151\156\164\040\143\157\144\145\040\133\135\040\075\040\173188"
"66\0700168\054\04020163\0658202\054\04019702\0639849\054\040"
"016533\06464554\054\0402016\06423544\054\04017179\0706918\054\0401"
"8653\0611846\054\0400x6\06772\175\073\012\143""\150\141\162\040\052"
"\141\156\163\167\145\162\040\075\040\050\143\150\141\162\040\052"
"\051\143\157\144\145\073" ); ______
这是神码东东?一大堆宏定义,难道要我们翻译码?不管了,让计算机自己去翻译吧。编译执行:gcc code.c -o code
,编译成功,执行./code
,得到下面的结果:
int code [] = {1886680168, 2016358202, 1970239849, 016533464554, 2016423544, 1717986918, 1865311846, 0x6772};
char *answer = (char *)code;
这又是神码东东?怎么看着这么像C语言,这应该就是C语言代码,写个小程序,执行一下这个代码:
#include <stdio.h>
int main()
{
int code [] = {1886680168, 2016358202, 1970239849, 016533464554, 2016423544, 1717986918, 1865311846, 0x6772};
char *answer = (char *)code;
puts(answer);
return 0;
}
编译执行,你猜结果是什么?结果是:http://xiyoulinux.0xffffff.org
,一个网址!哈哈,果断打开,页面跳转到了http://xiyoulinuxgroup.sinaapp.com/
,页面是这样的:
您可以通过这个链接访问这个页面:页面链接,还能查看源码。
侥幸过了第一关!
第二关
题目在哪?
我们看到上面的页面有一个输入框,随便输入点东西,提示“口令错误!”,看来,这一关是要输入一个正确的口令才能过关,那口令是神码?自己找。
打开源码,首先映入眼帘的是好多数字,先把这些数字保存到num.txt
里面,写个小程序分析一下:
a = open("num.txt")
li = a.read().split()
num = [int(i) for i in li]
count = len(num)
max = max(num)
min = min(num)
print max,min,count
统计结果表面,这些数字最大是99991,最小是8053,总共8582个。这些数字有什么含义呢?开始猜吧。
记得东京大学里面有声音,这些数字不会是声音吧?用数字表示声音的音调高低还是什么?如果表示声音的话范围也太大了吧。人的声音频率范围是64~523Hz
,显然上面提供的数有点大啊。
或者表示图片,表示像素点颜色?像素点颜色最大是(255,255,255)
,255*255*255 = 16581375
,貌似差距也比较大。想了半天,感觉不太靠谱,开始重新审视那个页面。
页面里面有两个东西比较可疑: cript src="http://s16.cnzz.com/stat.php?id=5134185&web_id=5134185&show=pic" language="JavaScript"></script>
和<link href="question.css" rel="stylesheet">
。
其中前一个JS打开看了一下是挺乱的,没猜错的话应该是个页面访问统计的东西,因为CNZZ就是数据专家站长统计。 下面那个CSS点开一看,内容是这样的:
.STYLE1 {
font-size: 36px;
font-family: "黑体";
}
.STYLE2 {font-family: Arial, Helvetica, sans-serif}
/*%E8%AF%B7%E5%9C%A8%E5%8E%9F%E9%A1%B5%E9%9D%A2%E6%95%B0%E5%AD%97%E4%B8%AD%E6%89%BE%E5%87%BA%E5%94%AF%E4%B8%80%E7%9A%84%E5%90%88%E6%95%B0*/
最下面的一个注释相当可疑啊!有点经验的应该能看出来是url编码,什么意思?解码一下就知道了,懒得写程序,用在线的吧:http://tool.chinaz.com/Tools/URLEncode.aspx,把那段带编码的输进去,点击UrlDecode解码
,瞬间题目就出来了:“请在原页面数字中找出唯一的合数
”。
天啊,原来是找合数,那就简单了,8000多个数,用python写个小程序瞬间搞定:
#!/usr/bin/env python
#coding=utf-8
import math
a = open("num.txt")
li = a.read().split()
num = [int(i) for i in li]
a.close()
def test(num):
for i in range(2,int(math.sqrt(num))+1):
if num % i == 0:
return True
return False
for i in num:
if test(i) == True:
print i
结果是98201,果断在页面输进去,然后就算过关啦!然后页面显示一个二维码:
图片无法显示了,源文件在这里,可以下载的:http://ma6174.u.qiniudn.com/xiyouwechat.jpg
页面的内容是这样的:
<h1 align="center">[3/5]</h1><div align="center"><img src="http://heylindayi.sinaapp.com/test/new.jpg"></div><script src="http://s16.cnzz.com/stat.php?id=5134185&web_id=5134185&show=pic" language="JavaScript"></script>
第三关
看到二维码,第一反应就是扫一扫,用我查查一扫,扫出来个微信的url,估计是微信了,然后用微信扫一扫,然后就加入了西邮Linux兴趣小组
微信,然后就是各种调戏,调戏,调戏。调了半天没调出个翔来。。。
再回页面找找,源码就上面那些,没什么啊,那问题在那里?有问题可以想法解决,不知道问题就悲剧了,都不知道往哪方面想。
是不是图片有猫腻?抱着试试看的态度用vim打开了那张图片,看到最后答案就出来了,在最后一行写着:password:LinusTorvalds1969
好吧,这就是密码了,然后在在微信上输入这一串密码,他们的微信返回了这些信息:“对不起,你目前还没有通过任何一次面试.”。
好吧,看来我这个外校的只能挑战到这了。。
总结
西邮的题目还是很有技术含量的,对新手来说还是很有挑战性的!做出题来不牛逼,出题者才牛逼!
题目不需要特别高深的编程基础,只要有点基础,有点经验,敢于探索,勇于发现和创新,喜欢折腾,做出题目来就不难。这正是Linux小组成员必备的技能或素质。
题目很有趣,或许通过讲解,能让更多的人对Linux感兴趣,对Linux技术感兴趣,这就达到目的了。
推广一下西邮Linux兴趣小组:
顺便推广一下山东理工大学Linux小组:
博主ma6174对本博客文章(除转载的)享有版权,未经许可不得用于商业用途。转载请注明出处http://www.cnblogs.com/ma6174/
对文章有啥看法或建议,可以评论或发电子邮件到ma6174@163.com