当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 10:27:23 Node.js

注意这里由于文章篇幅限制,本文为精简版。如果想看完整版,请访问以下地址:镜像1or镜像2在群里,我发现了一个有趣的链接光棍节程序员突破秀。点开之后,我整个人都像捡到宝一样颤抖。我最喜欢这种挑战。花了一个小时终于全部解密。下面是思路、分析和代码。由于sf良好的前端氛围,这里使用JavaScript作为工具语言。喜欢python的朋友可以参考我的另一篇解密,以python为示例语言一个有趣的解密话不多说,时间宝贵,马上开始解密之旅吧:)一级本科程序员的BreakthroughShowLevel1作为入门web的同学,自然是右击查看源文件:光棍节程序员的Level1Show(共10级)

Singles'DayProgrammerBreakthroughShowLevel1(共10关)

提示:从所有信息中找到通往下一关的路

进入下一级

其实我们也可以不查看源文件,直接在页面ctrl+a,可以让下一级的链接变成蓝色,直接点击即可。双十一程序员突破秀第二关Level2本关同上。我们也直接右键查看源文件。幸运的是,它写在评论中。双十一程序员突破秀第2关(共10关)

光棍节程序员突破秀第2级(共10级)

密码在哪?

进入下一关

我们复制密码,然后填入上面网址的k=,k参数应该代表密钥,也就是密码的意思。在接下来的几关中,我们将使用这种方法来完成跳跃。第三关光棍节程序员突破秀Level3页面上说这个关卡没那么简单。很明显,我们还是看了源码,但是这次他们没有给我们任何提示,什么都没有。这一关刚开始进入房间,大家动动脑筋想一想,这个密码会藏在哪里呢?下面开始脑洞分析:cookiesStoragecsshttpheaderconsole...我们终于在httpheader中一一找到了疑似密码字段:Content-Encoding:gzipContent-Type:text/html;charset=UTF-8Date:Fri,11Nov201605:23:01GMTThe-Key-Is:a87ff679a2f3e71d9181a67b7542122cTransfer-Encoding:chunkedX-Hit:sf-web1图中的一些key是我们想要的instant。输入网址,我们就可以来到第四层了。第四关光棍节程序员突破秀Level4这个关卡让我们遵守自己的密码规则。其实不言而喻,我们已经发现这些密码都是32位的,很像一个md5。有没有什么?那么法律是什么?记得上小学的时候经常出这种找规律的题。我们先推断规律可能是:当前的md5是前一个md5的结果,md5是某个正则数的结果。我们分别测试,最后发现md5("4");//a87ff679a2f3e71d9181a67b7542122c很明显下5级就是md5("5");//e4da3b7fbbce2345d7772b0674a318d5其实如果你猜不出来经过各种模式尝试,还是有机会的方法是我们在md5解密网站上试了一下,a87ff679a2f3e71d9181a67b7542122c的结果是4,也可以得出同样的结论。但这种方法只是无奈的侥幸,因为md5是一种校验算法,破坏了数据原有的结构,不可能恢复原来的结果。所谓“解密”,就是穷举法。我用md5对常见的字符串进行加密,然后把结果保存在数据中,作为一个key=value的字典,然后用的时候从里面搜索,看有没有碰撞。结果。有很大的机会。Level5双十一程序员突破秀Level5这个关卡开始变难了。首先,大家看到二维码的时候,相信大多数人都会和我一样,先扫一扫。然而,用手机扫描二维码非常耗时且难以分析。我们百度搜索在线二维码分析,然后上传这张图片,结果是:...http://sf.gg/你被骗了,跟我没关系。不信邪,所以单独测试了md5("http://sf.gg/你被什么都骗了")md5("你什么都没有被骗了")按照步骤再次检查到了第三层,还是什么都没有。看来谜底确实就在画面本身。让我们下载图片,然后右键单击并选择详细信息,看看密码是否会在这些字段中。尴尬的是里面什么都没有……等等,什么都没有?说明这个header明显是异常生成的。我们以十六进制打开它。这样的工具有很多,这里我用的是WinHex,发现了一个字符串:KEY:bdbf46a337ac08e6b4677c2826519542是ANSII编码的,所以可以直观的看出。也就是说,其实我们用系统自带的记事本是可以看到这个字符串的。根本不需要像WinHex这样的工具。不过,我这里主要想表达的是一种分析性的思考。如果这里使用unicode编码,或者包含中文时使用utf8编码,用记事本可能效果不佳。还是建议大家多掌握一些技巧和思路,结果不重要。通关不是目的,而是过程中学到的东西。第六关光棍节程序员突破秀第六关f4de502e58723e6252e8856d4dc8fc3b,只能告诉你这么多。我们也检查了第三层的步骤,但没有得到有用的信息。看来玄机就在这根弦上。.我们还是老样子,解密md5,只是这次就没那么幸运了。找不到对应的明文。实在没办法,只能借助强大的搜索引擎了。...坑爹的是,我们居然发现了这个,第一项:好像他给我们过了防水,嗯,虽然我到现在还没搞清楚这个key是怎么算出来的。..第七关光棍节程序员突破秀七关出问题去谷歌是个好习惯!再试试ba9b101dd284c566b78042d278e422bd嗯,看来上面这个问题的本意是让我们谷歌一下。好吧,我们照他说的做,继续谷歌ba9b101dd284c566b78042d278e422bd。然而时间过得很快,夜幕降临了,我们还是没有找到任何有用的信息。好吧,让我们注意一下,然后再试一次。它后面有一个空间。难不成下面的关键词不是让我们试试的吗?以下关键词是什么?第八关光棍节程序员突破秀第8关最后一关让我们了解到服从不是一个好习惯。以此类推,不羁不羁是多么重要,如果当年孙悟空不懂那三遍,说不定我们现在还在大唐。.在这个层面上,他说有时候事情就是这么简单。钥匙在他手里,门却不见了。我仿佛看到了他嘴角那抹嘲讽的笑意。好吧,忍受吧。我们也查看了源文件,光棍节程序员突破秀第8关(共10关)

光棍节程序员突破展示第8级(共10级)

有时候事情就是这么简单

钥匙在手,门却不见了

我们看到都笑了。这么大的GET,你当我傻。我们把这个GET改成POST,回车,轻松通过测试。第九关光棍节程序员突破秀第9关哦,这个关卡厉害了。估计大部分人都会被种草。这一关也是难度最大的关卡,也是我写这篇文章的目的。对于一个普通的web前端来说可能有点难度,因为涉及到很多其他的知识。幸好我不是前端。但是我都看到了!首先,0101很明显是一组二进制数,下面还有缺失的部分,我们先不管,先看前几个,打开计算器,把这些二进制数转成十进制看看。发现都在ascii表的可见字符范围内。32-126(共95个)为字符(32为空格),48-57为0-9十个阿拉伯数字,65-90为26个大写英文字母,97-122为26个小写英文字母,剩下的就是一些标点符号和运算符号。对于大学c语言的入门教程,大家要牢记在心,以后很多地方都会用到。我们试着翻译了之前没有遗漏的部分,结果是q6GDLaJ4yq9A7xFAnxyvsc/AT,这是什么鬼,这么长的部分明明不是key,这是什么?而且像密文一样乱七八糟。如果它是密文,它是用什么加密的?我们注意到中间有一个/,`可以出现在我们所知道的BASE64编码的中间,根据base64的原理,它最终的加密结果必须能被4整除。我们看了一下,有是8112组二进制数据,是一个能被4整除的数。同样,根据它的原理,如果原字符串长度不够,可以在末尾加上一两个等号。有了上面的线索,我们直接到最后一个二进制看是不是等号。但是,最后一位是00____01,显然我们需要填写中间四位数字。看来这是计算____代表的数字的机会了。看来我们走对了!!接下来我们在控制台执行:letcode="=".charCodeAt();console.log(code);//61console.log(code.toString(2));VM335:261VM335:3111101由此我们可以看出____应该代表1111。哈哈,很符合当时的主题:双十一。从这里,我们已经嗅到了胜利的味道,想必很快就可以打到最后一关了。我们复制上面的二进制列表,通过替换编辑成数组:接下来我们使用百度在线的base64解密工具。等等,解密结果是一串乱码?对了,这么长的base64显然不止一个key。可能需要我们再处理一次,所以既然不是字符串,那么很可能是文件。所以我们选择解密以十六进制显示,然后注意结果中的1f8b08。所有二进制文件头部的那几个字节都是文件头,一般用来标识文件。我们百度一下文件头大全,然后发现1f8b08表示是一个gz文件。那么我们不能简单的使用控制台,我们使用node环境将这个buff输出到一个文件中。varb=newBuffer(str,'base64');varfs=require('fs');fs.writeFileSync("test.gz",b);然后用解压工具解压,可以得到一张图:这个女人怎么看着眼熟?好吧,不管了,反正就是密码,我们敲下来完成这一关。恭喜你到了第十关,你已经通过了所有的关卡,但是第十关竟然是一个广告。.好的!结论我写这篇文章花了好几个小时,而且键盘坏了。兄弟还不支持?嘿嘿。