刷题10(1)

攻防世界_MISC_掀桌子

题目给了一串字符:

c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2

目测是16进制,刚好最近在学习JavaScript,就写个脚本试试

查资料

首先要找一下什么函数可以把十六进制转换为字符

String.fromCharCode(str)

可以将str转换为字符,str可以为任意类型

44

先写基本内容:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>攻防世界_MISC_掀桌子</title>
    </head>
    <body>
        <button onclick="demo()">?</button>
        <p id="demo">点击按钮输出全部</p>
    </body>
</html>

这一块会显示一个按钮,点击可以触发JavaScript代码
然后在<body>中加入<script>
先把要处理的字符串放进去,顺便设一个b来输出结果

var b = "";
var key = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2";

设一个for循环来挨个读取相邻的两个字符:

for (var i = 0; i < key.length; i += 2) {
            //读取第一个字符
            var j = key[i];
            //打印
            document.write("第一个字符=" + j);
            document.write("<br>");
            //读取第二个字符
            var k = key[i + 1];
            //打印
            document.write("第二个字符=" + k);
            document.write("<br>");
            //组合12
            var a = j + k;
            //打印
            document.write("第一个16进制字符=" + a);
            document.write("<br>");
            //转换为字符
            b += String.fromCharCode(a);
            document.write("转换为字符=" + b);
            //分割线
            document.write("<br><HR>")
        }

每次读取时输出一次,可以方便调试
按钮使用函数:

function demo() {
            //document.getElementById("demo").innerHTML = "?";
            document.getElementById("demo").innerHTML = "结果是:" + b;
        }

替换掉<p>中的文本
先看一下结果

发现并没有输出结果,查了一下c8发现是个无意义字符Ȁ

换思路

从十六进制转换为十进制换成ascii入手
c8换成十进制为200,超出了ascii的范围,所以要减128,得到72,换成字符为H
修改代码,加入转换为ascii的步骤:
查资料得知,十六进制转换为十进制使用parseInt(str,16),str为要转换的十六进制字符

//转换成ascii
var c = parseInt(a, 16) - 128;
document.write("转换为ascii=" + c);

再试试:

可以正常输出,点一下按钮,输出结果:

结果是:Hi, FreshDog! The flag is: hjzcydjzbjdcjkzkcugisdchjyjsbdfr

完整代码

<!doctype html>
<html>

<head>
    <meta charset="utf-8">

    <title>攻防世界_MISC_掀桌子</title>

</head>

<body>
    <button onclick="demo()">?</button>
    <p id="demo"></p>

    <script>
        var b = "";
        var key = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2";

        for (var i = 0; i < key.length; i += 2) {
            //读取第一个字符
            var j = key[i];
            //打印
            document.write("第一个字符=" + j);
            document.write("<br>");
            //读取第二个字符
            var k = key[i + 1];
            //打印
            document.write("第二个字符=" + k);
            document.write("<br>");
            //组合12
            var a = j + k;
            //打印
            document.write("第一个16进制字符=" + a);
            document.write("<br>");
            //转换成ascii
            var c = parseInt(a, 16) - 128;
            document.write("转换为ascii=" + c);
            document.write("<br>");
            //转换为字符
            b += String.fromCharCode(c);
            document.write("转换为字符=" + b);
            //分割线
            document.write("<br><HR>")
        }

        function demo() {
            //document.getElementById("demo").innerHTML = "?";
            document.getElementById("demo").innerHTML = "结果是:" + b;

        }
    </script>

</body>

</html>

kamuXiY