sf双十一解密答案及详解及分析思路

注意

因为此处文章有长度限制,本文是删减版,如需查阅完整版,请访问以下地址:javascript

镜像一
或者
镜像二css

前言

今天上班百无聊赖的在群里发现一个有趣的连接光棍节程序员闯关秀,点开以后浑身颤抖如获至宝啊。
我最喜欢这种挑战了。
花了一个小时的时间,终于所有解密。下面奉上思路和分析以及代码。因为sf良好的前端氛围,这里所有用JavaScript做为工具语言。
喜欢python的朋友能够参见我另外一篇用python做为示例语言的解密一个有意思的解密
话很少说,时间宝贵,咱们立马开始解密之旅吧:)
<!--more-->html

第一关

光棍节程序员闯关秀第1关
1a
做为一个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

  1. cookies算法

  2. Storage

  3. css

  4. http头

  5. console

  6. ...

咱们一项一项,最终在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

3
图中部分即时咱们要的key。
输入网址中,咱们便可来到第四关。

第四关

光棍节程序员闯关秀第4关

这一关让咱们观察咱们密码的规律。
实际上不用他说咱们已经发现,这些密码都是32位的,很是像一个md5有木有?
那么规律究竟是什么呢?我记得上小学的时候就常常有这种找规律的题,咱们先推断一下,规律多是:

  1. 当前的md5是上一个md5的结果

  2. 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编码,
用记事本就不必定有效了。
仍是建议你们掌握更多的诀窍和思路,结果并不重要。通关也不是目的,而是在这个过程当中学到了什么东西。

第六关

光棍节程序员闯关秀第6关

f4de502e58723e6252e8856d4dc8fc3b, 只能告诉你这么多

咱们一样的用第三关的步骤检查一遍,结果并无获得有用的信息。
看来玄机就在这个字符串上了。。咱们仍是老样子,去解密下这个md5,然而此次就没有那么幸运了。没有能找到对应的明文。
实在没办法了,咱们只能利用强大的搜索引擎了。。。。
坑爹的是咱们居然找到了这个,第一条:

6

看来是他防水给咱们经过了,好吧,虽然我到如今都没弄明白这个key是怎么算出来的。。。

第七关

光棍节程序员闯关秀第7关

有问题就Google是个好习惯! 再试试 ba9b101dd284c566b78042d278e422bd

好吧,看来上题本意就是让咱们谷歌啊。好吧,咱们就按照他说的,继续谷歌ba9b101dd284c566b78042d278e422bd
然而时间过的很快夜幕就要降临,咱们仍是没有找到有用的信息。
好吧,咱们注意下,再试试后面有个空格,有没有可能不是让咱们试后面的关键词的呢,那后面的关键词又是什么?

第八关

光棍节程序员闯关秀第8关

上一关让咱们学习到了听话并非一个好习惯。触类旁通桀骜不驯多么重要,当年孙悟空要是没明白那三下,说不定咱们如今仍是唐朝。。
这一关他说

有时候事情就是这么简单
钥匙就在手里, 门殊不知所踪

我放佛看到了他嘴角嘲弄的笑。嗯,忍了。
咱们一样查看源文件,

<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前端来讲多是有些难了,由于这里面牵涉到不少其它的知识。幸而我不是一个前端。
6
然而我已经看穿了一切!
首先 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解密工具。
等等,解密出来是一串乱码?

why

对嘛,这么长的一个base64显然里面不是只有一个key啊。可能须要通过咱们再次加工,那么既然它不是一个字符串,颇有多是个文件。
因而咱们选择

9

解密为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);

而后用一个解压缩工具解压后,便可获得一个图片:
10
为啥这个女的有点眼熟呢?好啦无论了,反正它上面的就是密码,咱们敲下来完成这一关。

第十关

恭喜, 你已经经过了全部关卡

然而第十关居然是个广告。。好吧!

结语

写这篇文章用了我好几个小时的时间,键盘都敲碎了,大哥们还不支持下?嘿嘿嘿。