在 http://solveme.peng.kr/ 上碰到了一道很坑的题目
http://helljs.solveme.peng.kr/
这道题打开源代码来看就知道是jsfuck
但是用普通的办法(控制台直接运行,或者网上找在线解码工具)并不能拿到源码
一筹莫展之际,找了一篇文章
https://zhuanlan.zhihu.com/p/33670115
文章里提到
看到有个翻译规则是:
eval => []["filter"]["constructor"]( CODE )()
。而我拿到的字符串也符合这个格式。所以我猜测flag在CODE部分。
也就是说jsfuck实际上是把源码藏在了CODE的部分,只要我们直接抠出这部分然后放控制台跑就得到源码了。
那么怎么抠出这部分呢?这里我发现使用sublime十分方便。观察格式可以知道CODE藏在三对中括号之后的小括号里面,那么我们按着这个规则来抠。
先把代码复制进sublime里
第一对中括号很容易找到,而第二对中括号却很难看出闭合在哪。这时我们可以把鼠标点击在第二对中括号的左括号之前
然后按Ctrl+Shift+Space
可以发现自动帮我们选择到了第二对中括号之内的内容,那么闭合的右括号也就找到了。然后再来一次找到第三对中括号的闭合处
可以看到果然第三对中括号之后就是小括号了,这时再照着来一次选择到小括号里的内容,复制到浏览器控制台里
发现并不是我们想要的源码,此时再看看sublime里的jsfuck,发现原来这一段代码之后还拼接着另一段jsfuck
那么照着同样的操作来调第二段,再次把获得的CODE放到控制台里跑
源码&flag GET!
这时我们发现第二段之后甚至还有其他的jsfuck,那么也就是说这其实不是一段jsfuck,而是多段jsfuck组合,难怪常规的jsfuck解码网站无法解出源码。不过知道了原理之后,以后再看见jsfuck自己调就行了,再也不用什么解码网站了~
ps: 如果只是一段的jsfuck只要删掉最后面的两个括号然后放控制台执行就能看见源码了