BUUCTF Reverse/[FlareOn4]login
下載下傳得到一個txt文檔以及一個HTML檔案
txt文檔裡面是提示
打開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 ("[email protected]" == rotFlag) {
alert("Correct flag!");
} else {
alert("Incorrect flag, rot again");
}
}
</script>
</body>
</html>
這條語句是對輸入的flag進行變換,最後與[email protected] 進行比較
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 ("[email protected]" == rotFlag) {
alert("Correct flag!");
} else {
alert("Incorrect flag, rot again");
}
百度了一下java中replace函數的應用
推測這個語句是對所有的大寫字母和小寫字母進行變換,重點是這個語句
(c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
charCodeAt(0)是傳回字元串中的一個字元。 a > b ? a : b 為三目運算符
這語句的意思為,将26個字母中的前13位變成26個字母中的後13位,比如A + 13 = N, O - 13 = B。根據這個算法寫出腳本
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char flag[] = "[email protected]";
for(i = 0 ; i < strlen(flag); i++)
{
if(flag[i] <= 'Z' && flag[i] >= 'A') //大寫字母
{
if(flag[i] <= 'M' && flag[i] >= 'A') //大寫字母前13個字母
{
flag[i] += 13;
}
else
{
flag[i] -= 13;
}
}
else if(flag[i] <= 'z' && flag[i] >= 'a') //小寫字母
{
if(flag[i] <= 'm' && flag[i] >= 'a') //小寫字母前13個字母
{
flag[i] += 13;
}
else
{
flag[i] -= 13;
}
}
}
printf("flag{%s}\n",flag);
return 0;
}
運作得到flag
flag{[email protected]}