#easy c++ reverse
原题如下:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
cout<<"Welcome to GWHT C++'s classroom!"<<endl;
cout<<"Now let's play the C++!"<<endl;
cout<<"Plz Input Your Flag: "<<endl;
string flag = "";
cin>>flag;
int len = flag.length();
for(int i=0;i<len;i++){
if(i%2==0){
flag[i] -= 2;
}
else {
flag[i] -= 7;
}
}
string temp = "";
for(int i=0;i<3;i++){
for(int j=0;j<len;j++){
if((i+j)%3==0){
temp += flag[j];
}
}
}
if(temp == "EM.*wk)vFA]Xs<=PypQ)]$"){
cout<<"you are good."<<endl;
}
else{
cout<<"keep work up."<<endl;
}
return 0;
}
Writeup
Flag中数组下标为偶数则减2,奇数则减7,
循环for(int i=0;i<3;i++){
for(int j=0;j<len;j++){
if((i+j)%3==0){
temp += flag[j];
}
}
}把改后flag打乱了拼接在了temp后面。
从temp == "EM.*wk)vFA]Xs<=PypQ)]$"知道改后flag一共有22位,下标从0到21,i有三个,分别为0、1、2,22除于3等于7余1,所以i=0对应8个j,i=1、2对应7个j。因为i+j可以整除3,所以i=0时y=0、3、6、9、12、15、18、21;i=1时y=2、5、8、11、14、17、20;i=2时y=1、4、7、10、13、16、19。
改后flag排好顺序后为"EPFMyA.p]*QXw)sk]<)$=v",这个我一开始是自己排好的顺序,后来写了一个程序重新排序,但还是不如自己排序。
写一个C++的程序跑一下,改后flag下标为偶数加2,奇数加7为原flag。
string a="EPFMyA.p]*QXw)sk]<)$=v";
for(int i=0;i<=21;i++)
{
if(i%2==0)
cout<<char(a[i]+2);
else
cout<<char(a[i]+7);
}
部分截图
得出flag为GWHT{H0w_1S_y0ur_C++?}