打开是一个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>
charCodeAt(0)是返回当前字符的Unicode 编码
String.fromCharCode返回Unicode对应的字符串
分析:
如果是大写就是90,小写就为122
与其ascll+13判断
大于为其自己+13,小于为其自己-13
大写都是小于90,故(A-M)是+13,(a-m)是+13
小写都是小于122,故(N-Z)-13,(n-z)是-13
写脚本:
a='PyvragFvqrYbtvafNerRnfl@syner-ba.pbz'
flag=''
for i in a:
if i >='A' and i<='M':
flag += chr(ord(i)+13)
elif i >='a' and i<='m':
flag += chr(ord(i)+13)
elif i>='N' and i<="Z":
flag+=chr(ord(i)-13)
elif i>='n' and i<='z':
flag+=chr(ord(i)-13)
else:
flag+=i
print(flag)
得到flag: flag{ClientSideLoginsAreEasy@flare-on.com}
后来看别人的wp才知道这是ROT13加密,就是将该字符替换为后13位的字符,例如A替换为N,N替换为A(超过Z循环回A)