解密:二叉树的秘密
昨天的万粉闯关活动让我始料未及,推文才刚刚发出十分钟左右,阳光普照奖就被抢完了,不到两小时,五个关卡所有红包也被清空,读者真是卧虎藏龙,高手如云啊~
是这次的题目太简单了吗?下一次增加点难度?
好啦,按照惯例,来解密一下昨天的关卡。
第一关
看看这棵二叉树,关键词已经提醒的很明显了,遍历!
关键词:二叉树遍历,注意大小写看看左下角的http,很明显这是一个URL,再观察h-t-t-p出现的顺序,可知道这是后续遍历的出场方式,所以第一关就很简单了,后续遍历一下这棵二叉树,答案就能揭晓:
http://suo.im/6bZxgm
其中要注意的是字母Z是大写的,这一点,在图片的提示中也有说明,不少人直接都是小写自然是打不开的。请不要放过给出的每一句提示!
打开这个URL,第一关告破:
话说,图片本身的链接是一个很长的URL,如果直接用它来做二叉树的话,那这棵二叉树就会长得很“茂盛”了,为了降低难度,用了一个短链接的技术压缩了一下。关于短链接设计,推荐大家看一下微信公众号『码海』的一篇文章:
第二关
拿到第一关口令的同时,第二关的入口也就浮出水面了:
https://www.cnblogs.com/xuanyuan/p/13275248.html
打开看看:
第二关的题目,我放在了我的博客园文章里,这篇文章是隐藏状态,在我的博客园主页是直接看不到的哦,不然就提前暴露了。
题目是要找到这8个链接对应的微信公众账号,然后根据要求找到对应的文章,将标题组合起来形成第二关的口令。
这道题的思路来源于微信公众号的二维码。我们经常扫描二维码关注,但有没有人想过这个二维码里面的包含的数据信息到底是什么样的?
这里推荐一个叫“草料二维码”的网站,它可以用来制作美化二维码、解析二维码。
那天,我就好奇用二维码数据解析,提取了一下,结果就是一个URL,一个代表你微信公众号的URL:
重要的是我发现,直接打开这个链接不会转到对应的微信公众号去,在手机上打开直接空白加载不出来,在电脑上打开会转到微信官方网站去。
所以这个题目的灵感来源就来了。
知道了原理,那对应的逆向思维就能解题了:把URL重新转换成二维码,用微信扫一下,公众号就能找到了!
按照这个办法,找到这8个微信公众号,分别是:
- 业余码农
- 我是程序员小贱
- IT人的职场进阶
- 小林Coding
- 后端技术学堂
- 泰斗贤若如
- 码海
- 后端技术指南针
按照题目要求,名字最短的,就是『码海』了,名字包含“南”字的就是『后端技术指南针』了。
当然,这里有一个小心机,为了让上面几个公众号都能曝光一下,我把第二关口令相关的两个号放在了最末尾
翻阅他们的公众号,找到符合要求的文章:
『码海』2020年第一篇文章:一文学会链表快慢指针解题技巧
『后端技术指南针』2019年最后一篇文章:从生日悖论谈哈希碰撞
口令分别取前五个字,答案就是:一文学会链从生日悖论
第三关
第二关的题目末尾给出了第三关的入口,这是一个百度网盘的链接,打开后,这是一个pcap格式的数据包。
是时候祭出神器wireshark了:
这里,为了降低难度,数据包已经被我简化,只包含一个一问一答的HTTP会话流量。
抛开TCP的三次握手和四次挥手和中间的ACK包,实际包含数据的就是一个HTTP请求包和一个HTTP响应包。
观察GET包的URL路径:
名为third_token,顾名思义,就是向服务器请求第三关的口令。很自然的想到,答案会在响应包中:
Response的正文是一段未知编码的数据,联想到之前口令红包都是中文,这里不妨使用wireshark对其进行解码:
第三关口令唾手可得。
彩蛋关1
上一篇推文提到,本次活动有2个隐藏的彩蛋关卡,其实都藏在这个数据包中。
看一下上面数据包中的那个GET请求:
注意,在Refer字段中,又有一个百度网盘的链接,code字段是提取码,打开看看:
又是一个名为color-egg1.pcap的数据包,下载后用wireshark再次打开。
同样为了简化,这里也只有一个HTTP会话的流量。
请求的URL是img,可猜想这是在请求一个图片,来看看响应包如何?
响应包乃是一段二进制数据,查看Content-Type字段,数据被gzip进行了压缩。想获知原始数据,需先解压。
这里wireshark神器又要大显威力了,先看原始数据:
在Decode as一栏中选择被压缩过Compressed,看到原始数据:
注意熟悉的PNG又来了,接着在show as一栏选择图像:
彩蛋关1宣布告破!
彩蛋关2
第二个彩蛋依然隐藏在第三关的那个数据包中,咱们再回过头去看看:
除了Refer,这一次我们把目光聚焦在Cookie字段,这是一段经过编码的数据,首先不管三七二十一,先怀疑base64编码,来解一下:
又是一个百度网盘的链接:
这次是一个exe可执行程序,需要一个Windows电脑系统,下载开来运行:
就一个很简单的问题,32位无符号数能表示的最大斐波那契数是什么?
那就写个程序来推导一下便可,利用斐波那契数列从第三项开始每一项都是前两项和的定义,依次往后推导:
1 1 2 3 5 8 13 21 ······
32位无符号数最大能表示多大?
0xFFFFFFFF,也就是4294967295,在推导的过程中,直到遇到比其更大的数,便停下来。就能得到答案:
2971215073
输入,即可获得口令:
对于有程序破解基础的朋友,又不想写代码去推导,那直接上神器IDA,逆向分析,刀斧加身,找到判断逻辑关键函数
修改这条关键的跳转指令,也能一蹴而就。
最后的话
没想到我的读者里高手如云,一会儿功夫就攻城拔寨,势如破竹。这里要向好不容易破解了题目却因为晚了一步红包被领完的读者们说声抱歉,你们忙活半天却空手而归,轩辕财力有限,红包数量不多,多多谅解,以后挣了钱,咱再多发一点。
希望这个活动能够持续下去,成为这个公众号的一个特色,下一次达到2W关注粉丝,咱们再次相约~
所以~
所以多多转发分享呀~