最近在网上找到一个逆向分析挑战的网站,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; }
输出结果为:
测试结果:
以上为第一个的分析解决方案,虽然很简单,但开始的第一步迈出去了,对于练习也好,对于博客也好。虽然写的很简单,可能有地方写的不好,希望看到的大家批评指正!
- 还没有人评论,欢迎说说您的想法!