最近在网上找到一个逆向分析挑战的网站,http://flare-on.com/。在这里可以下载到该网站出的一系列的逆向分析的题目,我下载了2017年的练习,总共12道题目。最近想把这些题目的结题过程写下来,当做一些积累吧。

第一道题目是一个网页题目,开始就给了一个login.html文件

 

用文本编辑器打开,发现里面是这样一段html

<!DOCTYPE Html />
<html>
    <head>
        <title>FLARE On 2017</title>
    </head>
    <body>
        <input type="text" name="flag" id="flag" value="Enter the flag" />
        <input type="button" id="prompt" value="Click to check the flag" />
        <script type="text/javascript">
            document.getElementById("prompt").onclick = function () {
                var flag = document.getElementById("flag").value;
                var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
                if ("PyvragFvqrYbtvafNerRnfl@syner-ba.pbz" == rotFlag) {
                    alert("Correct flag!");
                } else {
                    alert("Incorrect flag, rot again");
                }
            }
        </script>
    </body>
</html>

简单看下,知道这个网页上提供了一个文本框,然后对输入的文本进行加密,并将加密后的文本和"PyvragFvqrYbtvafNerRnfl@syner-ba.pbz"这段字符串进行对比。这里面的加密算法则是

var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});

如果能够找到解密算法,然后利用该算法对"PyvragFvqrYbtvafNerRnfl@syner-ba.pbz"进行解密操作,就能够得到输入的值。现在对这段加密算法进行分析:

1、该算法针对输入的每一个字符进行处理,且处理范围仅限大小写字母

2、90和122分别对应'Z'和'z',前面的大小判断是为了确定该字符是大写还是小写

3、后面的判断则是用'Z'和'z'与该字符加13之后的值进行比较,如大于,变成该字符+13,否则是该字符-13

4、而满足大于条件的只有字母表中前13个字符满足

这样看来,这段加密算法其实就是前13个字符和后13个字符的替换操作。依据该分析写解密程序:

char de(char input) {
    if ((input >= 'A' && input < 'A' + 13) || (input >= 'a' && input < 'a' + 13)) {
        return input + 13;
    }
    else if ((input >= 'A' + 13 && input <= 'Z') || (input >= 'a' + 13 && input <= 'z')) {
        return input - 13;
    }
    else
        return input;
}

int main()
{
    char result[] = "PyvragFvqrYbtvafNerRnfl@syner-ba.pbz";
    char origin[38];
    for (auto x : origin) {
        x = 0;
    }
    for (int i = 0; i < strlen(result) + 1; i++) {
        origin[i] = de(result[i]);
    }

    printf("origin input is %sn", origin);

    return 0;
}

输出结果为:

测试结果:

 

以上为第一个的分析解决方案,虽然很简单,但开始的第一步迈出去了,对于练习也好,对于博客也好。虽然写的很简单,可能有地方写的不好,希望看到的大家批评指正!

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!