上一篇部落格(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)那個點的值。什麼規律呢?我個人比較懶,規律都懶得找,讓Google幫我找找吧,將上面的數字Google一下,點開第一個結果,就來到了這個網站: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)座標開始,先向左,再向上,然後向右,向下,就是沿著數字增大的方向,正好是一個順時針的螺旋線!再來看看數字有什麼規律?萬能的Google其實剛才已經告訴我們答案了,在開啟的那個雅虎問答網站上,有人回答: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.63username:lastpasswd:good_job
看這意思,應該是最後一關了,給你使用者名稱和密碼,讓你去登陸,但問題來了,在瀏覽器上輸入上面的IP,根本打不開,本機ping了一下,不通,然後又在站長工具上ping了一下,全部逾時。然後又掃了一下那個IP的連接埠,什麼都沒掃出來。然後查了一下這個IP的歸屬地,結果:
查詢的 IP:222.24.19.63 來自:陝西省西安市 郵電學院GeoIP: Xian, ChinaChina 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 CSTNmap scan report for 222.24.19.3Host is up (0.073s latency).Nmap scan report for 222.24.19.4Host is up (0.088s latency)....此處省略若干行...Nmap scan report for 222.24.19.201Host is up (0.072s latency).Nmap scan report for 222.24.19.202Host is up (0.087s latency).Nmap done: 256 IP addresses (66 hosts up) scanned in 4.89 seconds$
掃了一下,收穫不小啊,這個網段內竟然有66台機器是開著的!半夜一點還開機,除了程式猿的電腦就是伺服器了(小碼哥語錄)!哈哈!66台,看來這應該是一個伺服器的位址區段,隨便找幾個看看。
開啟最後那個222.24.19.202一看,我差點笑出來!為什麼呢?先看張,題目明天再做,下面這個更有趣。
正方教務系統!!這個還沒啥可笑的,大家仔細看我圈出來的那塊驗證碼,這裡需要我們輸入紅色的文字,除了Google的驗證碼,沒見過比這還變態的!知道這變態驗證碼的來曆嗎?聽小碼哥慢慢道來~
記得去年冬天,我們Linux小組在一起討論技術,聊到了教務管理系統。原來正方教務系統是沒用驗證碼的,但是查詢不太方便,關鍵是我們學校在校外幾乎不能訪問教務系統,寒暑假想查成績那叫一個難啊!於是乎,我們Linux小組以拯救全人類的身份站出來了,一定要打通對外通道,要讓校外的學生方便查成績!由於我們的特殊網路環境,對外只能開放80連接埠,要協助外界訪問校內網站的話,不外乎有以下幾種方式:
使用代理:原理很簡單,就是我在外網不能訪問正方系統,但是Proxy 伺服器能訪問,我還能訪問Proxy 伺服器,那麼我們只要像Proxy 伺服器發送請求,然後Proxy 伺服器向正方系統發送請求,然後正方系統返回給Proxy 伺服器,然後Proxy 伺服器再返回給我們就OK了。代理可以使用ssh或者squid
使用VPN:通過串連學校的VPN伺服器,我們就和學校的VPN伺服器建立了一個Virtual Private Cloud(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校賽,我還要看場子去呢!二三百號人呢!今天就少扯點,第五關忙完了再搞。