上一篇博客(http://www.cnblogs.com/ma6174/archive/2013/05/04/3058889.html)發表后,西郵Linux小組發微信並且在博客上提示挑戰還沒有結束,這個提示:“對不起,你目前還沒有通過任何一次面試.”和這次挑戰沒關系。看來是我理解錯了,小組那邊也疏忽了這個問題。還要繼續挑戰。
晚上看到@goodname大神的回復,說是圖片可以解壓,嘗試了一下,7z e new.jpg
,奇跡出現了,提示輸入密碼,上文提到,我們已經獲得密碼了,輸入密碼:LinusTorvalds1969
,得到了一個文件:new.txt
!內容是StayHungryStayFoolish
,看來這就是進入下一關的密碼了!!太神奇了,一張圖片,竟然可以隱藏這么多的信息!真心佩服西郵Linux小組!
果斷在微信上輸入密碼:StayHungryStayFoolish
,順利進入下一關。
第四關
輸入上面的密碼之后,微信返回一張圖片
分析
這個題看着像是找規律的,給你幾個坐標點的值,讓你算(-5,-5)
那個點的值。什么規律呢?我個人比較懶,規律都懶得找,讓谷歌幫我找找吧,將上面的數字谷歌一下,點開第一個結果,就來到了這個網站:http://answers.yahoo.com/question/index?qid=20100308160117AAPQ1pp,這個網站上有人提問:
1 1 1 3 5 9 17 31 57 WHAT IS THE RULE FOR THE PATTERN?
I AM TRYING TO FIND THE RULE FOR THE PATTERN.
再回去審視一下那張圖片,看到規律了吧?!簡單描述一下就是從(0,0)
坐標開始,先向左,再向上,然后向右,向下,就是沿着數字增大的方向,正好是一個順時針的螺旋線!再來看看數字有什么規律?萬能的谷歌其實剛才已經告訴我們答案了,在打開的那個雅虎問答網站上,有人回答:3 previous digits equal the next one. 1+1+1=3 1+1+3=5 1+3+5=9 etc.
。懂了吧?就是說從第四個數開始每個數就是前三個數的和。感覺和斐波那契額數列差不多。寫個遞推或者遞歸程序很輕松就能解決。還有個問題比較關鍵,坐標(5,5)
那個點是第幾個數?如果想不出來的話就在紙上畫畫,比如樓主這么笨的人就是在紙上畫出來的。后來想明白了,不畫也可以的,因為按照圖片的環繞方法,只要繞到(5,5)
那個點,那么坐標絕對值小於5的點肯定是被繞到的,也就是說要算一個數,那么我們只需要算以(|5|,|5|)
為邊界的正方形里面有多少點就是了。很明顯,每行11個,總共11行,11×11=121,也就是算第121個數的值!python解決這種問題小菜一疊:
a = [1,1,1]
for i in range(3,121):
a.append(a[i-1]+a[i-2]+a[i-3])
print i,a[i]
這里使用了遞推算法,因為遞歸層數太深,效率太低。通過這個程序算出,第121個數是:24948097296824045968731381433737
,真沒想到竟然這么大!幸虧我用python這門語言,天生支持大整數,不然用C等程序再去處理大整數就費勁了!人生苦短,大家抓緊時間去學學python吧!
將這一長串數字輸入到微信,然后順利進入最后一關!
第五關
輸入上面的數字之后,微信返回下面的信息:
[5/5]
IP:222.24.19.63
username:last
passwd:good_job
看這意思,應該是最后一關了,給你用戶名和密碼,讓你去登陸,但問題來了,在瀏覽器上輸入上面的IP,根本打不開,本機ping了一下,不通,然后又在站長工具上ping了一下,全部超時。然后又掃了一下那個IP的端口,什么都沒掃出來。然后查了一下這個IP的歸屬地,結果:
查詢的 IP:222.24.19.63 來自:陝西省西安市 郵電學院
GeoIP: Xian, China
China Education and Research Network
看來這是個教育網。我們學校的網站對外只開放80端口,也就是說外網只能訪問服務器的80端口,內網沒用限制,難道西郵也這樣?這僅僅是一種猜測。或許題目設計者故意這么設計的,可能還需要一些特殊的方法才能訪問到這台服務器。比如借助其他機器訪問。
首先先掃掃222.24.19.0/24
這個網段吧: 這是2013年5月5日0點55分的掃描結果
$ nmap -sP 222.24.19.0/24
Starting Nmap 5.21 ( http://nmap.org ) at 2013-05-05 00:54 CST
Nmap scan report for 222.24.19.3
Host is up (0.073s latency).
Nmap scan report for 222.24.19.4
Host is up (0.088s latency).
...此處省略若干行...
Nmap scan report for 222.24.19.201
Host is up (0.072s latency).
Nmap scan report for 222.24.19.202
Host is up (0.087s latency).
Nmap done: 256 IP addresses (66 hosts up) scanned in 4.89 seconds
$
掃了一下,收獲不小啊,這個網段內竟然有66台機器是開着的!半夜一點還開機,除了程序猿的電腦就是服務器了
(小碼哥語錄)!哈哈!66台,看來這應該是一個服務器的地址段,隨便找幾個看看。
打開最后那個222.24.19.202
一看,我差點笑出來!為什么呢?先看張截圖,題目明天再做,下面這個更有趣。
正方教務系統!!這個還沒啥可笑的,大家仔細看我圈出來的那塊驗證碼,這里需要我們輸入紅色
的文字,除了谷歌的驗證碼,沒見過比這還變態的!知道這變態驗證碼的來歷嗎?聽小碼哥慢慢道來~
記得去年冬天,我們Linux小組在一起討論技術,聊到了教務管理系統。原來正方教務系統是沒用驗證碼的,但是查詢不太方便,關鍵是我們學校在校外幾乎不能訪問教務系統,寒暑假想查成績那叫一個難啊!於是乎,我們Linux小組以拯救全人類的身份站出來了,一定要打通對外通道,要讓校外的學生方便查成績!由於我們的特殊網絡環境,對外只能開放80端口,要幫助外界訪問校內網站的話,不外乎有以下幾種方式:
-
使用代理:原理很簡單,就是我在外網不能訪問正方系統,但是代理服務器能訪問,我還能訪問代理服務器,那么我們只要像代理服務器發送請求,然后代理服務器向正方系統發送請求,然后正方系統返回給代理服務器,然后代理服務器再返回給我們就OK了。代理可以使用ssh或者squid
-
使用VPN:通過連接學校的VPN服務器,我們就和學校的VPN服務器建立了一個虛擬專用網絡(
Virtual Private Network
),也就是說我們的網絡就和服務器在一個網段,也就是校內網啦,校內網訪問正方肯定是沒問題的,於是乎就能正常查成績了。 -
做一個新的網站,網站的功能就是獲取用戶的正方系統用戶名和密碼(好孩子從來不保存人家的密碼),根據用戶的需求,我們去正方系統模擬登陸,然后查詢信息,再將有用的信息返回給用戶。當然,這個新的網站必須是能快速訪問到正方系統的。
分析了一下,使用代理和VPN都比較麻煩,對新手來說往往不知道怎么設置,但是網站就簡單了,只要知道域名,打開瀏覽器就訪問訪問,簡單,方便,還好擴充新功能。
於是,我聯合@zhwei一起搞了個http://gotit.asia/正方教務系統查詢網站。當初做這個網站的時候,功能很單一,就是同學輸入自己的學號密碼,選擇查成績或者查課表,然后我們就查出來了。那是相當方便啊!寒假放假前和寒假里,我們的網站迎來了訪問小高峰,每天的訪問量最少也要幾千吧。(PS:北京時間:半夜兩點整)
假期里,我們又增加了計算學分基點功能。但是好景不長,有一天zhwei突然給我打電話說網站出問題了,沒法查詢了,跑教務處網站一看,原來是教務處網站增加驗證碼了!估計是管理員發現教務處的異常,也就是大量訪問來自同一個IP(僅僅是猜測),然后增加了這樣的驗證碼:
上面的圖像太小,放大一下看看
分析一下,我們可以看到這個驗證碼還是比較變態的,數字驗證碼,每個數字顏色不同,單個數字組成的像素點顏色也不同,還有大量干擾點,字體還這么小。
商量了一下,然后就開始和zhwei同學搞這個驗證碼,之間學了python圖像處理相關知識,還有高級點的python模擬提交(就是有驗證碼),還有就是用firefox的firebug插件分析網絡請求等知識。
經過一段時間的研究分析和測試,我們是這樣的:首先是將驗證碼圖像灰度圖像,也就是黑白的,然后再降噪,刪除干擾點,處理之后,大約能達到這樣的效果:
上面的圖片處理的就算是比較好了。然后再用ocr字符識別程序自動識別驗證碼。經過測試,識別正確率能達到百分之八九十,這就很好了,如果識別不成功,重新抓一張圖片去識別,多抓幾張,識別成功率就高了!哈哈。
至此,我們的查成績網站就比教務處的網站有優勢了:校外能登陸,不用輸入驗證碼,查成績課表考試時間等方便,還能自定計算學分基點,那叫一個好用啊!哈哈!訪問量更是提高啊,最高一天5萬PV!8000多獨立訪客!放一張網站的百度統計圖炫耀一下:
后來我們又增加了四六級查詢功能。但是好景不長,終於有一天,又接到了@zhwei的電話,說,網站有不能用了,快去看看正方系統吧!打開一看,就像前面看到那張西郵的正方系統截圖一樣,驗證碼成中文了,但是,我們學校的驗證碼比西郵的還變態,因為西郵的大部分漢字我們還是認識的,我們學校的字好多都是生僻字,都不認識!大學白上了!汗~
還要想法解決中文驗證碼問題啊!打算用原來那種方式,簡單處理后交給OCR去識別,但是OCR在識別中文的時候就不是那么給力了,識別率低得慘不忍睹!這么多漢字,我們不可能去手工建字模識別,干脆直接讓用戶去識別吧!
由於網站只讓輸入紅色的漢字,那我們就過濾一下唄,把不是紅色的漢字過濾掉,讓用戶方便識別和輸入。
但是新的難題又來了,因為驗證碼刷新之后每次都會變,那么如何將正方系統的驗證碼放到我們的網站上還能保證驗證碼不過期呢?經過一番研究之后,發現下面的方法可行:
用戶訪問我們的gotit查成績網站,我們在后台首先訪問一次正方網站,記錄cookies和viewstate等信息,然后用這個cookies去請求驗證碼,抓取下來之后,將圖片顯示給用戶,當然包含這個驗證碼和viewstate。我們將這些驗證碼和viewstate等信息保存下來,其實是把那個函數保存下來,這就是python里面的閉包。因為用戶的請求是無連接的,我們如何區分用戶輸入的驗證碼是哪個驗證碼呢?把viewstate一塊傳遞到前台,用戶在輸入用戶名,密碼還有驗證碼,點擊提交的時候,viewstate一塊傳遞到后台,然后我們后台就能根據viewstate來定位到原來的訪問函數來繼續訪問!這樣檢索到成績等信息后再返回。終於搞定了! 記得當時模擬這個過程的時候沒有注意編碼,正方是gb2312
的,我在linux下寫python一直用utf-8
,怎么交都不行。后來還是@zhwei發現了這個問題才讓我們實現登陸功能。
(PS:北京時間:半夜三點整)
啰啰嗦嗦一大堆,簡單概括一下,就是:
正方沒驗證碼 -> gotit網站能正常查成績 ->
正方升級增加數字驗證碼 -> 我們的網站自動識別驗證碼登陸 ->
正方升級增加中文驗證碼 -> 我們處理中文驗證碼讓用戶輸入然后登陸查成績 ->
明天,不,今天我們學校還要舉行第四屆ACM校賽,我還要看場子去呢!二三百號人呢!今天就少扯點,第五關忙完了再搞。