题目描述

来源:tinyctf-2014

Solution

题目是一个附件,用 HxD 打开,发现里面有 JavaScript 代码:

1.png

我们改用浏览打开,发现页面只有一个输入框:

2.png

我们注意到文件尾巴有一个eval(_),整个页面可能是根据它执行的。我们把它改成alert(_),可以看到页面弹窗,内容是 JavaScript 的某个算法:

3.png

我们把它复制出来,把格式美化一下:

  1. function $() {
  2. var e = document.getElementById("c").value;
  3. if (e.length == 16) if (e.match(/^be0f23/) != null) if (e.match(/233ac/) != null) if (e.match(/e98aa$/) != null) if (e.match(/c7be9/) != null) {
  4. var t = ["fl", "s_a", "i", "e}"];
  5. var n = ["a", "_h0l", "n"];
  6. var r = ["g{", "e", "_0"];
  7. var i = ["it'", "_", "n"];
  8. var s = [t, n, r, i];
  9. for (var o = 0; o < 13; ++o) {
  10. document.write(s[o % 4][0]);
  11. s[o % 4].splice(0, 1)
  12. }
  13. }
  14. }
  15. document.write('<input id="c"><button onclick=$()>Ok</button>');

可以发现,如果我们输入一个字符串,长度为 16,并且满足它的限制条件,Flag 就要由字母表安装一定规则给算出来。

由于我们的输入不会影响字母表的运算,所以我们直接把里面的逻辑复制出来再修改一下:

let flag = "";

var t = ["fl", "s_a", "i", "e}"];
var n = ["a", "_h0l", "n"];
var r = ["g{", "e", "_0"];
var i = ["it'", "_", "n"];
var s = [t, n, r, i];
for (var o = 0; o < 13; ++o) {
    flag += s[o % 4][0];
    s[o % 4].splice(0, 1)
}

console.log(flag);

然后用 NodeJS 去运行脚本:

4.png