[NSSCTF 2022 Spring Recruit]easy C
下载附件,得到c文件

点击查看代码
#include <stdio.h>
#include <string.h>
int main(){
char a[]="wwwwwww";
char b[]="d`vxbQd";
//try to find out the flag
printf("please input flag:");
scanf(" %s",&a);
if(strlen(a)!=7){ //flag的长度为7
printf("NoNoNo\n");
system("pause");
return 0;
}
for(int i=0;i<7;i++){ //对flag进行异或
a[i]++;
a[i]=a[i]^2;
}
if(!strcmp(a,b)){ //a=b
printf("good!\n");
system("pause");
return 0;
}
printf("NoNoNo\n");
system("pause");
return 0;
//flag 记得包上 NSSCTF{} 再提交!!!
}
加密
对源码进行分析,可知
a也就是flag,经过for循环,先每位+1,再与2异或,得到b
解密
可以通过逆向分析
就是将b先与2xor,再-1,最终得到flag

点击查看代码
flag = ''
b = 'd`vxbQd'
for i in range(7):
flag += chr((ord(b[i])^2)-1)
print(flag)
flag: NSSCTF{easy_Re}
小记
-
在python中是不支持a++,a--。但支持a+=1,a-=1这种形式的,而--a,++a在python中--则会认为是负负得正,++则会认为正正还是正,所以不会报错,是可行的。
-
str与chr的区别。str()用于将数字之类转换为字符串进行操作,例如str(12)就是将数字12转换为字符串’12’,而chr()就是将ASCII码中的数字转化为其对应的字符,例如chr(97)就是字符’a’。
-
int与ord的区别。int()用于将字符串形式输入的数字转换为整数,例如int(‘1’)就是字符串’1’转换为数字1,而ord()能将字符转换为ASCII码,例如ord(‘A’)对应的ASCII码为65。

浙公网安备 33010602011771号