還記得東京大學情報理工學系的招生海報嗎?只要答對了問題,然后你就被錄取了。當時可火了,人人和微博瘋狂轉載。
如今西郵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技術感興趣,這就達到目的了。