1.elf

其加密的过程是

v1 = -85;
  v2 = 0;
  for ( i = 0; i <= 39; ++i )
  {
    for ( j = 0; j <= 50; ++j )
    {
      v1 ^= j ^ v2 ^ 0x5F;
      s[i] ^= s[(i + 1) % 40];
      s[i] ^= v1;
      ++v2;
    }
  }

可以直接找到它加密后的字符串

image

可以直接根据加密算法逆推答案

#include<stdio.h>
int main()
{
    char s[] = { 161, 186, 110, 70, 128, 244, 217, 170, 180, 54, 90,
   204, 140, 30, 149, 33, 143, 67, 225, 19, 138, 168, 106,
   66, 174, 251, 247, 165, 157, 11, 75, 222, 186, 0, 135,
   35, 144, 70, 211, 223,'\0'};//需补充'\0'作为字符串结尾(后续解密不需修改)
    char v1 = -85;
    int v2 = 0;
    v1 = -85;
    v2 = 0;
    int i, j;
   for (i = 0; i <= 39; ++i)
    {
        for (j = 0; j <= 50; ++j)
        {
            v1 ^= j ^ v2 ^ 0x5F;
            ++v2;
        }
    }//加密时是从前往后加密,则解密需要从后往前解密,需要求出最后的v1对应的值才能做解密运算
    for (i = 39; i >= 0; --i)
    {
        for (j = 50; j >= 0; --j)
        {
            --v2;
            s[i] ^= v1;
            s[i] ^= s[(i + 1) % 40];
            v1 ^= j ^ v2 ^ 0x5F;
        }
    }//将后面的加密顺序调转(包括指令如加密中最后的++v2变为最上方的--v2,异或运算不用变化,只需跟随加密顺序再将顺序逆转就可进行解密运算了
    puts((char *)s);//以字符串输出
    return 0;
}

解出答案就是SYC{bIIngxvJqVDOUqbuiHDpadwfdRePetteyBP}
在程序中输入验证后确实就是正确答案
image

posted @ 2022-12-28 14:28  润梧  阅读(71)  评论(0编辑  收藏  举报