若饭1024程序员节闯关活动解
2021-06-24: 图没啦,代码也乱码了hhh
讲真1024不应该是,,咳咳的节日嘛?(*__**) 嘻嘻……
安利时间
若饭是一个代餐粉品牌,和国外的soylent比较像。从口感上若饭是我觉得比较适口的,我在大一个大三都买过几箱若饭(七袋一箱,一箱够吃好一个月了)作为代餐解决午饭晚饭问题。特此安利一下给大家。
不过活动已经停止啦,因为可能太简单还是泄露原因,我从看题到通关也就花了10分钟多一点吧。
第一关
第一关的地址在公众号复制就可以直接浏览,作为入口。
http://static.ruffood.com/1024/ (opens new window)
可以看得到首页内容只有
图已丢失
除此没有其他信息,但是按照常识我们先检索其源代码。
图已丢失
源代码果然有提示,毕竟第一题,可以看得到有一串字符串aHR0cCUzQS8vc3RhdGljLnJ1ZmZvb2QuY29tLzEwMjQvZGllcjIuaHRtbA==,很明显是一个base64样子的字符串,尝试性给他解码,我得到了第二关地址。 http://static.ruffood.com/1024/dier2.html (opens new window)
第二关
第二关的首页是一幅图片,除此以外没有其他东西。
图已丢失
再看其源代码,好像也没有别的东西了。
图已丢失
那我能想到的首先是图片里面藏信息,(聪明的男孩子都懂得)。图片里面藏信息有太多种方法,但是不巧的一件事是,我对这幅图片进行base64编码再解码后发现文件末尾出现了一个标准的URL链接(这其实用txt打开也可以看得到了),毫无疑问这就是第三关的地址了。
图已丢失
这是Chrome 保存下载的离线文件,刚好对图片资源进行了base64编码,我们解码看看,
图已丢失
前面解码后是图片的byte字节,所以用字符显示肯定是乱码,但是图片结尾解码出了一个URL。嗯,就是它了。
http://static.ruffood.com/1024/disan333333san.html (opens new window)
第三关
第三关的首页终于有一点有用的信息了。
图已丢失
e10adc3949ba59abbe56e057f20f883e这是一段意义不明的字符串,但是如果你有接触过MD5彩虹表(密码进行MD5编码后的数据库)的话,就知道这一串非常有可能是MD5加密(谁叫他恰好是123456的MD5编码,一眼认出来了)。所以单单MD5加密发展至今已经不是一个安全的加密方案了,往往需要伴随使用盐值防止彩虹表的爆破。 那么,开始查询彩虹表(百度搜索就行了,这条太著名了),验证了这条字符串的含义就是123456,得到了一条不知道有什么用的线索。
然后继续看源代码,也有提示。
图已丢失
提示是一条js代码。初步一看,意义不明,明显经过了混淆(我菜,,看不出来)。但不紧要,我们先把它复制到console里面运行一下,发现它没有报错,而且输出为undefined。那么肯定这条eval代码执行了什么没有输出的命令。
具体要看它执行了什么,还得一步步整理和挖掘。我把它复制进去了IDE,重新格式化。格式化的时候发现这是eval了一条立即执行的匿名函数的输出。那么我们继续拆分,拆掉eval,然后获得函数输出。
function t(p, a, c, k, e, d) {
e = function(c) {
return (c < a ? "\" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
};
if (!''.replace(/^/, String)) {
while (c--) d[e(c)] = k[c] || e(c);
k = [function(e) {
return d[e]
}];
e = function() {
return '\\w+'
};
c = 1;
};
while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
return p;
}
const res = t('2 1(0){3\'5\'+0+\'.4\'}', 6, 6, 'num|genurl|function|return|html|siguanla'.split('|'), 0, {})
debugger图已丢失
我们不用关心混淆的代码,(因为我打断点发现混淆的代码真的没什么hhhh)
我们得到了最终输出是一个定义JS函数的字符串,而eval 通过执行这段js字符串代码,定义了一个全局函数,所以这条命令执行没有报错,也没有输出。
这个函数意义已经很明显了,也不需要再次执行。经过拼接,我们得到了第四关的地址。
http://static.ruffood.com/1024/siguanla123456.html
第四关
图已丢失
第四关很直白,欢迎了一下我。嗯,我先看看源代码。
图已丢失
嗯,我就喜欢这么直白的,这一关比前一关还简单。
这一串提示,很明显是十六进制字符串,我们先解析成数字。
const oriStr = '0x640x6f0x630x350x2e0x740x610x720x2e0x670x7a'
const numArr = []
for(let i = 0; i < oriStr.length;) {
numArr.push(parseInt(oriStr.substring(i, i + 4)))
i += 4
}
// numArr = [100, 111, 99, 53, 46, 116, 97, 114, 46, 103, 122]可以看得到全部都没有超过128,我基本猜测这就是ASCII码值了,先尝试一下。
const chArr = []
for(let num of numArr) {
chArr.push(String.fromCharCode(num))
}
// chArr = ["d", "o", "c", "5", ".", "t", "a", "r", ".", "g", "z"]嗯,把每一个字组合起来,这就是一个压缩包文件名。join起来后就是新的URL了。
chArr.join('')
// output = "doc5.tar.gz"http://static.ruffood.com/1024/doc5.tar.gz (opens new window)
第五关
第五关是一个文件啊,那就先下载下来解压。解压后发现只有一个"doc5.xslx"文件,而且打开后发现没有任何隐藏内容,所以是一个合法的excel表格文件。
但是xslx其实这样看没什么用,xslx格式文件本质上是一堆使用微软xmln的xml文件的压缩包,Excel通过解析其内部不同的xml文件,样式文件、内容文件、以及其他定义文件,渲染出一个excel表格。所以我们可以直接从其xml文件入手。
图已丢失
解压发现内部有一个陌生文件,ruofan.xml,名字是商标,遂打开它看看。
图已丢失
发现它根本不是xml文件,,而是又是一串字符串(没有换行符?)。(没有难度啊兄弟。。)
虽然没有==尾缀,但是看样子这还是一个base64字符串,继续解码看看,如果没有意外的话游戏已经结束了。
<Default Extension=\"urlTarget\" Value=\"666ruofan.html\"/>
解密后倒是符合xml格式了hhhh,得到了一个URL
http://static.ruffood.com/1024/666ruofan.html (opens new window)
打开后看得到,
图已丢失
果然已经通关了,原本源代码还有领奖方式。但是这个活动已经提前结束了哈哈,幸好我完成得早。
结束
还是挺有趣的,虽然不是很难。但是估计真的难起来我就GG了,领了100优惠券,总的来说非常的划算。开心
