天天看點

BUUCTF Reverse/[FlareOn4]login

BUUCTF Reverse/[FlareOn4]login

BUUCTF Reverse/[FlareOn4]login
下載下傳得到一個txt文檔以及一個HTML檔案
BUUCTF Reverse/[FlareOn4]login
txt文檔裡面是提示
BUUCTF Reverse/[FlareOn4]login
打開HTML檔案,又是一道字元串比較的題目,右鍵檢視源代碼
BUUCTF Reverse/[FlareOn4]login
<!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函數的應用
BUUCTF Reverse/[FlareOn4]login
BUUCTF Reverse/[FlareOn4]login
推測這個語句是對所有的大寫字母和小寫字母進行變換,重點是這個語句
(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
BUUCTF Reverse/[FlareOn4]login
flag{[email protected]}