因爲此處文章有長度限制,本文是刪減版,如需查閱完整版,請訪問以下地址:javascript
今天上班百無聊賴的在羣裏發現一個有趣的連接光棍節程序員闖關秀,點開以後渾身顫抖如獲至寶啊。
我最喜歡這種挑戰了。
花了一個小時的時間,終於所有解密。下面奉上思路和分析以及代碼。因爲sf
良好的前端氛圍,這裏所有用JavaScript
做爲工具語言。
喜歡python
的朋友能夠參見我另外一篇用python做爲示例語言的解密一個有意思的解密
話很少說,時間寶貴,咱們立馬開始解密之旅吧:)
<!--more-->html
光棍節程序員闖關秀第1關
做爲一個web入門的學員,咱們天然而然的直接右鍵查看源文件:前端
<html> <head><title>光棍節程序員闖關秀第1關(總共10關)</title></head> <body style="background: #172024; color: #54BA3E; font: 100%/1.5 Menlo, Consolas, Courier, monospace; text-align: center; padding: 10% 0 0 0"> <h2>光棍節程序員闖關秀第1關(總共10關)</h2> <u>提示: 從全部信息中找到進入下一關的方法</u> <p><a style="color: #172024" href="?k=e70030d49158de95087eae6469f5319e">進入下一關</a></p> </body> </html>
而實際上,咱們不查看源文件也是能夠的,直接在頁面上ctrl+a
,就可讓進入下一關
的連接變藍,直接點擊便可。java
光棍節程序員闖關秀第2關
這一關同上,咱們也是先直接右鍵查看源文件,幸運的是,它寫在了註釋裏。node
<html> <head><title>光棍節程序員闖關秀第2關(總共10關)</title></head> <body style="background: #172024; color: #54BA3E; font: 100%/1.5 Menlo, Consolas, Courier, monospace; text-align: center; padding: 10% 0 0 0"> <h2>光棍節程序員闖關秀第2關(總共10關)</h2> <!-- 不錯嘛,密碼在此:4c29dbaf326fe76232390dac0917e921 --> <!-- 強插廣告: 歡迎訪問 http://segmentfault.com 或者 http://sf.gg --> <p>密碼在哪呢?</p> <form><input autocomplete="off" placeholder="輸入密碼" name="k" /></form> <p><a style="color: #172024" href="javascript:alert('你太天真了');">進入下一關</a></p> </body> </html>
咱們複製出密碼,而後填在上面網址的k=
後面,k
參數應該是表明key
,也就是密碼的意思。在之後的幾關裏咱們都是用這種方法來完成跳轉。python
光棍節程序員闖關秀第3關 程序員
頁面上說,這關就沒有那麼簡單了。顯而易見的,咱們仍是查看源代碼,然而他們此次沒有給咱們任何提示,一無所得。
這一關纔開始登堂入室了,咱們開動大腦想想,這個密碼會藏在哪裏呢?
開動腦洞分析吧:web
cookies算法
Storage
css
http頭
console
...
咱們一項一項,最終在http頭
裏找到了疑似密碼的字段:
Content-Encoding:gzip Content-Type:text/html; charset=UTF-8 Date:Fri, 11 Nov 2016 05:23:01 GMT The-Key-Is:a87ff679a2f3e71d9181a67b7542122c Transfer-Encoding:chunked X-Hit:sf-web1
圖中部分即時咱們要的key。
輸入網址中,咱們便可來到第四關。
這一關讓咱們觀察咱們密碼的規律。
實際上不用他說咱們已經發現,這些密碼都是32位的,很是像一個md5有木有?
那麼規律究竟是什麼呢?我記得上小學的時候就常常有這種找規律的題,咱們先推斷一下,規律多是:
當前的md5是上一個md5的結果
md5是某個有規律的數的結果
咱們分別測試最後咱們發現
md5("4");//a87ff679a2f3e71d9181a67b7542122c
那顯然易見的是,下一關5是
md5("5");//e4da3b7fbbce2345d7772b0674a318d5
其實若是各類嘗試都沒法猜到規律的話,還有一個撞運氣的作法,就是咱們去md5解密的網站上試一下,a87ff679a2f3e71d9181a67b7542122c
的結果爲4
。也能夠獲得相同的結論。
可是這種方法只是一種碰運氣無奈之舉,由於md5
是一種校驗算法,已經破壞了數據的原始結構,再不可能還原成原來的結果。
所謂"解密"就是窮舉法,本身用md5
分別加密常見的字符串再將結果以key=value
的字典方式保存到數據裏,而後等用的時候再從這裏面查找,
看是否有已經碰撞出結果。具備很大的偶然性。
光棍節程序員闖關秀第5關
這一關開始,就變得比較難了起來。
首先看到一個二維碼,我相信大多數人都和我同樣,先掃爲快。可是手機掃描二維碼很是耽誤咱們時間,並且很差分析。
咱們百度搜索在線二維碼解析
,而後傳上去這個圖片,結果居然是:...
http://sf.gg/你被耍了什麼都沒有
我了個去,我還不信邪,分別測試了
md5("http://sf.gg/你被耍了什麼都沒有") md5("你被耍了什麼都沒有")
而後又按照第三關的步驟檢查了一遍仍是一無所得。
看來玄機確實就在這個圖片自己上,咱們下載這個圖片,而後右鍵,詳情,看看密碼會不會在這些字段裏。
尷尬的是裏面居然什麼都沒有...
等等,什麼都沒有?說明這個頭片顯然是以一種非正常方式生成的。咱們用十六進制的方式打開它。
此類工具備不少,此處我使用的是WinHex
,發現裏面有個字符串:
KEY:bdbf46a337ac08e6b4677c2826519542
它是ANSII
編碼的,因此能被直觀的看到。也就是說,其實咱們用系統自帶的記事本能夠看到這個字符串的。
根本不須要WinHex
之類的工具。然而我這裏主要要表達的是一種分析思路。若是它這裏是用的unicode編碼,或者含有中文時用的utf8編碼,
用記事本就不必定有效了。
仍是建議你們掌握更多的訣竅和思路,結果並不重要。通關也不是目的,而是在這個過程當中學到了什麼東西。
f4de502e58723e6252e8856d4dc8fc3b, 只能告訴你這麼多
咱們一樣的用第三關的步驟檢查一遍,結果並無獲得有用的信息。
看來玄機就在這個字符串上了。。咱們仍是老樣子,去解密下這個md5
,然而此次就沒有那麼幸運了。沒有能找到對應的明文。
實在沒辦法了,咱們只能利用強大的搜索引擎了。。。。
坑爹的是咱們居然找到了這個,第一條:
看來是他防水給咱們經過了,好吧,雖然我到如今都沒弄明白這個key是怎麼算出來的。。。
有問題就Google是個好習慣! 再試試 ba9b101dd284c566b78042d278e422bd
好吧,看來上題本意就是讓咱們谷歌啊。好吧,咱們就按照他說的,繼續谷歌ba9b101dd284c566b78042d278e422bd
。
然而時間過的很快夜幕就要降臨,咱們仍是沒有找到有用的信息。
好吧,咱們注意下,再試試後面有個空格,有沒有可能不是讓咱們試後面的關鍵詞的呢,那後面的關鍵詞又是什麼?
上一關讓咱們學習到了聽話
並非一個好習慣。觸類旁通
,桀驁不馴
多麼重要,當年孫悟空要是沒明白那三下,說不定咱們如今仍是唐朝。。
這一關他說
有時候事情就是這麼簡單
鑰匙就在手裏, 門殊不知所蹤
我放佛看到了他嘴角嘲弄的笑。嗯,忍了。
咱們一樣查看源文件,
<html> <head><title>光棍節程序員闖關秀第8關(總共10關)</title></head> <body style="background: #172024; color: #54BA3E; font: 100%/1.5 Menlo, Consolas, Courier, monospace; text-align: center; padding: 10% 0 0 0"> <h2>光棍節程序員闖關秀第8關(總共10關)</h2> <p>有時候事情就是這麼簡單</p> <p>鑰匙就在手裏, 門殊不知所蹤</p> <form method="GET"> <input type="text" name="k" value="f57c633b47691a70744a04128e491c32" /> </form> </body> </html>
一看咱們就笑了。
那麼大的GET
,你當我傻啊。咱們把這個GET
改爲POST
,回車一下,輕鬆過關。
光棍節程序員闖關秀第9關
嚯,這一關厲害了。目測大多數人要栽了。這一關也是最難的一關,也是我要寫本文的目的。
對於一個普通的web
前端來講多是有些難了,由於這裏面牽涉到不少其它的知識。幸而我不是一個前端。
然而我已經看穿了一切!
首先 0 1 0 1 這種的明顯是組二進制,下面有缺失的部分,咱們先無論,咱們先看看前面幾個,打開計算器,把這些二進制轉幾個到十進制看看。
發現它們全是位於ascii表的可見字符範圍。
32-126(共95個)是字符(32是空格),其中48-57爲0到9十個阿拉伯數字。
65-90爲26個大寫英文字母,97-122號爲26個小寫英文字母,其他爲一些標點符號、運算符號等。
大學c語言入門課程,你們要記牢,之後用的地方不少。
咱們試着譯出前面不缺失的這部分,結果爲
q6GDLaJ4yq9A7xFAnxyvsc/AT
我去,這什麼鬼,這麼長的部分明顯不是key,那是什麼呢?並且亂七八糟的像個密文。假使它是個密文,它又是什麼加密的?
咱們注意到中間有個/
,咱們所知的BASE64
碼中間能夠出現`,而且根據
base64`的原理,它最後加密結果必定能被4整除。
咱們看了下,共有8112
組2進制數據,是個能被4整除的數。一樣的,據其原理,若是原字符串的長度不足,可能要在最後補一到兩個等號。
有了以上這些線索,咱們直接去最後一個二進制看看是否是等號。
然而最後一個倒是00____01
,很明顯是須要咱們補齊中間四位的。看來這就是算____
所表明數的契機啊。看來咱們的路子走對了!!
下面咱們在console上執行:
let code ="=".charCodeAt(); console.log(code);//61 console.log(code.toString(2)); VM335:2 61 VM335:3 111101
由此可知____
表明的應該是1111
。哈哈,到時符合主題:雙十一。
由此,咱們已經嗅到了勝利的氣息,想必立刻能夠到最後一關了。
咱們把上面的二進制列表複製下來,用替換,來編輯成一個數組:
接下來咱們百度一個在線base64解密工具。
等等,解密出來是一串亂碼?
對嘛,這麼長的一個base64
顯然裏面不是隻有一個key
啊。可能須要通過咱們再次加工,那麼既然它不是一個字符串,頗有多是個文件。
因而咱們選擇
解密爲16進制顯示,而後咱們注意下結果裏面的1f 8b 08
,全部二進制文件的頭部的幾個字節都是文件頭,通常做爲識別文件用。
咱們百度文件頭大全
,而後發現1f 8b 08
表明它是一個gz
文件。
那接下來咱們單純使用控制檯是不行了,咱們用node
環境來把這個buff輸出到一個文件中去。
var b = new Buffer(str, 'base64'); var fs= require('fs'); fs.writeFileSync("test.gz", b);
而後用一個解壓縮工具解壓後,便可獲得一個圖片:
爲啥這個女的有點眼熟呢?好啦無論了,反正它上面的就是密碼,咱們敲下來完成這一關。
然而第十關居然是個廣告。。好吧!
寫這篇文章用了我好幾個小時的時間,鍵盤都敲碎了,大哥們還不支持下?嘿嘿嘿。