[ACTF新生赛2020]usualCrypt

[ACTF新生赛2020]usualCrypt

总体分析

点进byte_40E0E4函数界面,大概就能猜到解密与base64解密有关了

image-20241027204832026

点进sub_401080()函数

image-20241027204927868

确实是常见的base64加密

但这里有两个自定义函数 sub_401000() sub_401030(a)

sub_401000()

int sub_401000()
{
  int i; // eax
  char v1; // cl

  for ( i = 6; i < 15; ++i )
  {
    v1 = key[i + 10];
    key[i + 10] = key[i];
    key[i] = v1;
  }
  return i;
}

我修改了一下变量名

这里主要是对加密表进行了简单的移位变换

key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
key_list = list(key)
for i in range(6, 15):
    v1 = key_list[i + 10]
    key_list[i + 10] = key_list[i]
    key_list[i] = v1
key = ''.join(key_list)

得到key = ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/

sub_401030(a)

int __cdecl sub_401030(const char *a1)
{
  __int64 v1; // rax
  char v2; // al

  v1 = 0i64;
  if ( strlen(a1) )
  {
    do
    {
      v2 = a1[HIDWORD(v1)];
      if ( v2 < 'a' || v2 > 'z' )
      {
        if ( v2 < 'A' || v2 > 'Z' )
          goto LABEL_9;
        LOBYTE(v1) = v2 + 32;
      }
      else
      {
        LOBYTE(v1) = v2 - 32;
      }
      a1[HIDWORD(v1)] = v1;
LABEL_9:
      LODWORD(v1) = 0;
      ++HIDWORD(v1);
    }
    while ( HIDWORD(v1) < strlen(a1) );
  }
  return v1;
}

这是对解密结果进行大小写替换

脚本实现

enc = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
enc2 = enc.swapcase()

得到enc2 = ZmxhZ3tiGNXlXjHfaDTzN2FfK3LycRTpc2L9

丢到base64解码软件就行

image-20241027205623500

flag{bAse64_h2s_a_Surprise}

posted @ 2024-10-27 20:58  结城希亚  阅读(31)  评论(0编辑  收藏  举报