[NSSCTF 2022 Spring Recruit]easy C

下载附件,得到c文件
image

点击查看代码
#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

image

点击查看代码
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。

posted @ 2022-11-13 10:02  Zer0o  阅读(661)  评论(0)    收藏  举报