hackergame2020总结
2048
简单做法
通关,合并出「大成功」,就能得到 flag。
注意:如果在合并出「大成功」的同时方块无法移动了,算输 qwq。
复杂做法
查看网页源代码,发现提示:
<!--
changelog:
- 2020/10/31 getflxg @ static/js/html_actuator.js
-->
进而打开 static/js/html_actuator.js
这个文件,找到和游戏胜利有关的逻辑:
var url;
if (won) {
url = "/getflxg?my_favorite_fruit=" + ('b'+'a'+ +'a'+'a').toLowerCase();
} else {
url = "/getflxg?my_favorite_fruit=";
}
let request = new XMLHttpRequest();
request.open('GET', url);
如果访问 /getflxg?my_favorite_fruit=
可以得到返回信息:
还没有大成功,不能给你 flxg。
这正是游戏失败时的提示信息。
我们打开 Chrome 浏览器的开发者工具,切换到 Console 标签页,执行一下 ('b'+'a'+ +'a'+'a').toLowerCase()
,得到正确的应该填入的值为 banana
,访问 /getflxg?my_favorite_fruit=banana
,则可以得到正确的 flag。
这里解释一下 ('b'+'a'+ +'a'+'a').toLowerCase()
为何就等于banana
。可以先把字符串分成四部分1.'b'
2.'a'
3.+'a'
4.'a'
。可以看到第三段用到了一元加运算符。
知识点
一元加运算符可以把数字字符串转换为数字,如下:
var sNum = "20";
alert(typeof sNum); //输出 "string"
var iNum = +sNum;
alert(typeof iNum); //输出 "number"
而当转换+'a'
时,由于a不是数字字符就会输出NaN
—(Not a Number),于是字符串就变为baNaNa
。然后全部小写,结果就是banana
。
一元运算符详见:https://www.w3school.com.cn/js/pro_js_operators_unary.asp