ctf writeup之程序员密码 起因 第零关 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关 第九关 不足

在v2ex上看到有人发了一篇帖子,说做了一个程序员小游戏,遂试玩了一下。

游戏的地址在这里: http://www.bettertomissthantomeet.com/pages/level.html

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

第零关

控制台打印的字符“Hello, world!”,复制粘贴通过。

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

第一关

控制台又打印了一串字符:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

看着像base64,拿去解码,得到“I'm a programmer.”,复制粘贴通过。

第二关

为毛又是控制台打印…

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

拿去base64解码,得到“ping www.programmerpassword.com”,遂ping了一下:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足 

将ip地址“47.104.152.148”复制粘贴通过。

感觉这个设计得不太好,因为一般ping的话是为了看ttl延时,少数情况是为了解析到ip地址,不过好歹也能够联想到。

第三关

这次控制台没有输出了,并且页面上也没有啥提示,于是ctrl+shift+c选了下提交按钮,然后看到了

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

这是一个透明元素,所以页面上看不到,复制“123456”粘贴没通过….需要完整的复制“密码是123456”粘贴提交才能通过,作者很顽皮啊。

第四关

这次还是老的套路,控制台打印了一串十六进制数:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

拿去解码(关键词十六进制转字符串),将“4275672072756e6e696e67”转为字符串“Bug running”,复制粘贴通过。

第五关

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足 
选一下这个井号:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足 

看到有一个样式是rgb(r,g,b)这种格式指定的,然后页面上又是一个大大的井号,遂将“rgb(47, 69, 132)”拿去rgb转hex,得到“#2F4584”,但是很悲剧的事情是作者的判断正确的方法是将我们提交得的答案md5和正确答案的md5进行比对,所以就没办法兼容大小写这种情况,这个是我想吐槽的第一点。然后我想吐槽的第二点是没有办法兼容大小写就算了标准答案还是非主流的小写…hex的A-F很少有用小写的,所以就导致大多数人都会被坑一下…

提交“#2f4584”通过。

第六关

控制台打印了一堆东西,很明确表示这是base64。然后观察base64的开头和img的src base64很像,遂拿去放到一个html中:

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<img src="data:image/png;base64,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">

</body>
</html>

打开这个html:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

提交“463700”通过。

第七关

有个挂掉的图片:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

然后切换到network看一下:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

发现这明明是个doc类型的好吧,然后手动打开:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

提交“better to miss than to meet”通过。

第八关

页面上显示了一行字:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

控制台也有输出:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

遂在控制台使用getPassword()方法解密(别问我怎么知道的,因为我读了这个js…):

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

提交“25LTQWMP9Y”通过。

第九关

这关是设计得还比较好的,因为所使用的技术的特点体现的非常好。

页面上就这么一张图片:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足

看了半天,以为玄机在图片上的代码里,还去看了PDO的相关资料….代码成功的吸引了猿类的注意力,如果是一张风景图之类的恐怕就能够秒想到图片隐写术。

右键把图片保存到本地,然后使用winhex打开,搜索FFD9找jpg图片的结尾。

jpg文件有一个特点就是以FFD9为结束符,结束符之后的内容就直接无视,利用这个特性可以往尾部藏一些东西。

下图中高亮的部分都是会被无视的内容:

ctf writeup之程序员密码
起因
第零关
第一关
第二关
第三关
第四关
第五关
第六关
第七关
第八关
第九关
不足 

这是两行命令,最有可能的答案就是这两行命令的输出了,来分析一下可能会输出什么:

cd /data/log/../www/
pwd

log会被..约掉,所以是cd /data/www/然后用pwd输出当前路径,Linux下pwd是不会带最后的斜线的,所以最终的输出就是“/data/www”,提交通过。

不足

核心的判断逻辑在这个js中:http://www.bettertomissthantomeet.com/static/js/app/level.js,将判断放在前端还很齐齐整整,人家只要阅读一遍这个js就大概了解了,这样大大降低了难度不太好。

不过最后的隐写术真的很6,成功误导我在PDO的方向上越走越远,花了一大会儿时间才想到….

.