这几天在V2EX上看到一个面向程序员的小游戏——在网页中找到一个隐藏的密码即可过关。游戏目前总共有两个level, level1有10道题,level2有5道题。游戏规则虽然简单,但是想要过关还是需要掌握不少知识,比如:’Chrome Developer Tools’工具使用、Baes64解码、图片隐写术等等。
游戏挺有意思的,在这里记录下,写者无心,读者请闭眼。
Level1
进入游戏只有一个密码输入框,第一反应是打开开发者工具,寻找蛛丝马迹。通过细心观察,果然发现Console
有信息打印,并且对源码进一步分析,游戏核心代码在js/app/level.js
文件里。level.js
粗略看下来,主要包含两部分重要信息:关卡通过对玩家输入的密码进行md5
加密验证以及每个关卡执行的函数(存放在LevelManager.prototype.levels
数组里)。
总体分析下来,得到的信息如下:
1)Console有信息提示
2)每个关卡的触发函数
3)md5加密
level1-0
密码:1
Hello, world!
level1-1
对Console
打印的信息进行Base64解码 (为啥会想到Base64?因为字符最后的=
号)
密码:1
I'm a programmer.
level1-2
对cGluZyB3d3cucHJvZ3JhbW1lcnBhc3N3b3JkLmNvbQ==
进行Base64解码,得到1
ping www.programmerpassword.com
进而在终端执行ping,获取ip地址
密码:1
47.104.152.148
level1-3
本关卡没有在Console
里打印信息,但是通过对关卡函数分析,本关卡在页面上插入了一段html
代码,并且设置了透明样式。
密码:1
密码是123456
level1-4
Console
打印了一串数字,使用String.fromCharCode()
将十六进制整数转ascii码。
密码:1
Bug running
level1-5
本关卡在页面上插入了一段html
代码,只显示了一个#
。开始以为是和jQuery
的id选择器有关,结果答案却是#
文字的RGB颜色值。
密码:1
#2f4584
level1-6
图片的Base64编码,需要添加头部data:image/jpeg;
。
密码:1
463700
level1-7
访问img.src
指定的url。
密码:1
better to miss than to meet
level1-8
在Console
里输入window.getPassword("H4sIAAAAAAAAC7MPcHq2ZWH987ndEfYA5w4bAwwAAAA=")
密码:1
25LTQWMP9Y
level1-9
最坑爹的关卡,以为密码会隐藏在给出的PHP代码里,然而,然而,被坑了。。。把图片下载下来,然后使用十六进制编辑器打开图片,从jpg图片里可找到cd /data/log/../www/; pwd
附加信息。
jpg隐写技巧原理可以参考这篇文章隐写技巧-利用JPEG文件格式隐藏payload
密码:1
/data/www
总结Level1关卡,整体难度其实并不高,只要善于使用谷歌开发者工具以及掌握Html&Css、Base64编码、JPG隐写术等知识点就能轻松过关。
Level2
Level2总共有5道题,虽然题目减少,但是难度较Level1提升了好几个档次。当然,坑更多…
level2-0
页面提示区显示了一段乱码,显然本关卡只需要解决乱码问题即可找到密码。
打开开发者工具,找到发起的ajax请求,如下图:
通过分析可以发现,Html页面编码采用UTF-8,而ajax请求Http Response Content-Type Header设置了GBK编码类型,这就是导致乱码的原因。破解此题,只需如下操作:
右键拷贝curl请求,然后打开终端,执行curl请求:
密码:1
春花秋月何时了
level2-1
本关卡提示信息是一张写有二进制的图片,显然第一反应是把图片上的二进制转成字符串,可以得到error!
。经过试验,密码并不是error!
。那么error!
这几个字母是不是作者给我们的提示了,记过漫长时间的思考,终究没有找到答案。得放弃这个方向了,又是图片隐写术了?把图片下载下来,分析发现这是一张正常的图片,并没有添加额外的附加信息。又经过一段时间的思考,突然想到,是不是密码存放在图片属性里。立马右键图片,查看属性内容,果然图片添加了“备注”,心里一乐。
密码:1
ZCFHJJUKLI
上文里其实介绍过JPG隐写术,本关卡也是隐写术的一种,使用JPEGsnoop工具打开图片亦可查找到备注信息。