buu-reverse-[FlareOn4]login
核心代码解读
html源码可以直接查看核心是jq
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);});
alert(rotFlag)
if ("PyvragFvqrYbtvafNerRnfl@syner-ba.pbz" == rotFlag) {
alert("Correct flag!");
} else {
alert("Incorrect flag, rot again");
}
}
代码含义就是:
- 正则匹配每一个字母
- 对每一个匹配到的字符进行如下操作:
(c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26
也就是
if(c<='Z'){
cmp=90;//Z
}else{
cmp=122;//z
}
c = c + 13;
if(cmp >= c){//替换后,码大等原来的
c = c;
}else{
c = c - 26;
}
cout<<c;
注册机
python字符数字运算需要用转换比较麻烦,这题东西也少就直接用C写了。
本质上是个半暴力,因为最后要么是c = c+13要么是c=c+13-26,而且是对单个字符的,时间复杂度可控
两种可能的逆向式子
- c-=13
- c = c - 13+26
#include <bits/stdc++.h>
using namespace std;
bool isAlpha(char c){
if(c>='A' && c<='Z')
return true;
if(c>='a' && c<='z')
return true;
return false;
}
int main(){
/////////////ClientSideLoginsAreEasy@flare-on.com
/////////////ClientSidefoginsAreEasy@flare-on.com
/////////////PyvragFvqrsbtvafNerRnfl@syner-ba.pbz
char s[105]="PyvragFvqrYbtvafNerRnfl@syner-ba.pbz";
char flag[105];
char tmp;
for(int i=0; i<strlen(s); i++){
if(isAlpha(s[i])==0){
flag[i]=s[i];
continue;
}
tmp=s[i]-13;
if(i==10)
cout<<endl<<tmp<<endl;
if(isAlpha(tmp)){
flag[i]=tmp;
}
tmp = s[i]-13+26;
if(isAlpha(tmp)){
flag[i]=tmp;
}
}
flag[strlen(s)]='\0';
cout<<flag;
return 0;
}
其中执行结果是:ClientSidefoginsAreEasy@flare-on.com
但是却不对,原因是第十一个字符应该是第一种式子的结果
也就是是L不是f,修改后:ClientSideLoginsAreEasy@flare-on.com
就是flag了:flag{ClientSideLoginsAreEasy@flare-on.com}