[LitCTF 2023]debase64

最后更新于 2024-07-14 401 字 预计阅读时间: 2 分钟


PE32位程序,打开ida分析伪代码得到关键函数

还见过base64解码的re分析一下base64解码的伪代码

 for ( i = 0; i != 64; ++i )
    {
      while ( byte_404000[i] != *v3 )
      {
        if ( ++i == 64 )
          goto LABEL_7;
      }
      LOBYTE(v14) = i;
    }
do
    {
      while ( byte_404000[i] != a1[v4 + 1] )
      {
        if ( ++i == 64 )
          goto LABEL_11;
      }
      BYTE1(v14) = i++;
    }
    while ( i != 64 );

  for ( j = 0; j != 64; ++j )
    {
      while ( byte_404000[j] != *v7 )
      {
        if ( ++j == 64 )
          goto LABEL_15;
      }
      BYTE2(v14) = j;
    }
 for ( k = 0; k != 64; ++k )
    {
      while ( byte_404000[k] != *v9 )
      {
        if ( ++k == 64 )
          goto LABEL_19;
      }
      HIBYTE(v14) = k;
    }

base64编码先是对字符串进行3字节->4字节操作后用4字节的每个字节的值在base64_table上找对应的值,那么解码就先将解码的字符串在码表上找到其对应位置在进行4字节->3字节的操作,上面部分代码就是在码表上找对应位置,将每个位置放在一个int类型的变量中对应四个字节。

 *(a2 + v5) = (4 * HIBYTE(v14)) | (BYTE2(v14) >> 4) & 3;
 *(a2 + v5 + 1) = (16 * BYTE2(v14)) | (BYTE1(v14) >> 2) & 0xF;
 v5 += 3;
  *(a2 + v5 - 1) = (BYTE1(v14) << 6) | v14 & 0x3F;

上述代码进行4字节->3字节的操作

上述解码后的结果有26位即13字节,但base64解码后必须是3的整数倍故将最后的0xff舍弃,得到解码后的值46ED1896569ED272B2B38070,对其进行hex2str在进行base64操作得到Y0uReallyKn0wB4s,我们输入的flag有20位,Y0uReallyKn0wB4s有十六位,题目给出三个等号和MD5对其进行爆破

import hashlib
flag = 'Y0uReallyKn0wB4s'
for i in range(32,128):
    a = flag + chr(i) + '==='
    if hashlib.md5(a.encode()).hexdigest() == '5a3ebb487ad0046e52db00570339aace':
        print(a)
        break

得到Y0uReallyKn0wB4s3===

此作者没有提供个人介绍。
最后更新于 2024-07-14