zoukankan      html  css  js  c++  java
  • base64特征

    base64是一种常见的加密方式,具体能用在哪里,咱这里就不细说了,这里只说一下,base64代码和密文的一些特征,方便在以后的CTF或者是逆向中快速识别这种加密方式。

    ————————————————————————————————————————————

    首先我们来看看base64的加密过程,先了解一下base64是如何加密的,才能更好的理解base64的一些特征。

    首先base64中的64是指的64四个可见字符集:

    我们知道,数据储存在我们的电脑中,是按照字节来存储的,一个字节8个bit。

    base64编码,每3个8位明文数据为一组,取这3个字数据的ASCII码,然后以6位为一组组成4个新的数据。
    对于不足3字节的处理:
    1.不足三字节后面填充0;
    2.对于编码前的数据产生的6位,如果为0,则索引到的字符为‘A’;因不足3字节而填充的0,用’=’来替代。

    现在用ABCD为例子:

    这张图很明显的显示了base64是如何加密的,这里看到最后的“=”,这就是base64的第一个特点,base64的加密后面,经常跟着等号“=”。

    当然,最开始的字母表,也可以让我们来确定是否为base64.

    然后是通过代码来判断:

    这里我们给一段某ctf中ida的base64加密伪代码:

    void *__cdecl sub_411AB0(char *a1, unsigned int a2, int *a3)
    {
      int v4; // STE0_4
      int v5; // STE0_4
      int v6; // STE0_4
      int v7; // [esp+D4h] [ebp-38h]
      signed int i; // [esp+E0h] [ebp-2Ch]
      unsigned int v9; // [esp+ECh] [ebp-20h]
      int v10; // [esp+ECh] [ebp-20h]
      signed int v11; // [esp+ECh] [ebp-20h]
      void *Dst; // [esp+F8h] [ebp-14h]
      char *v13; // [esp+104h] [ebp-8h]
    
      if ( !a1 || !a2 )
        return 0;
      v9 = a2 / 3;
      if ( (signed int)(a2 / 3) % 3 )
        ++v9;
      v10 = 4 * v9;
      *a3 = v10;
      Dst = malloc(v10 + 1);
      if ( !Dst )
        return 0;
      j_memset(Dst, 0, v10 + 1);
      v13 = a1;
      v11 = a2;
      v7 = 0;
      while ( v11 > 0 )
      {
        byte_41A144[2] = 0;
        byte_41A144[1] = 0;
        byte_41A144[0] = 0;
        for ( i = 0; i < 3 && v11 >= 1; ++i )
        {
          byte_41A144[i] = *v13;
          --v11;
          ++v13;
        }
        if ( !i )
          break;
        switch ( i )
        {
          case 1:
            *((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];
            v4 = v7 + 1;
            *((_BYTE *)Dst + v4++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
            *((_BYTE *)Dst + v4++) = aAbcdefghijklmn[64];
            *((_BYTE *)Dst + v4) = aAbcdefghijklmn[64];
            v7 = v4 + 1;
            break;
          case 2:
            *((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];
            v5 = v7 + 1;
            *((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
            *((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];
            *((_BYTE *)Dst + v5) = aAbcdefghijklmn[64];
            v7 = v5 + 1;
            break;
          case 3:
            *((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];
            v6 = v7 + 1;
            *((_BYTE *)Dst + v6++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
            *((_BYTE *)Dst + v6++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];
            *((_BYTE *)Dst + v6) = aAbcdefghijklmn[byte_41A144[2] & 0x3F];
            v7 = v6 + 1;
            break;
        }
      }
      *((_BYTE *)Dst + v7) = 0;
      return Dst;
    }
    

    我们看到这里有几个标志性的符号:

    这里出现了0x3F和3,其中0x3F是指的base64中的64个(0-63,共64个)字符集;3是指是三个字节合并。

    总结

    base64的一些特征:

    1.密文中会出现“=”等号。

    2.有64个可见字符。

    3.代码中含有0xF、0x3F、0x3等符号(当然如果可以理解代码就更好了)

  • 相关阅读:
    【NOIP】提高组2015 运输计划
    【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    【51nod】1766 树上的最远点对
    【BZOJ】2054: 疯狂的馒头
    【SRM20】数学场
    【Luogu】P3930 SAC E#1
    【Luogu】P3927 SAC E#1
    【Luogu】 P3928 SAC E#1
    【Codeforces】868C. Qualification Rounds
    【CodeForces】866D. Buy Low Sell High
  • 原文地址:https://www.cnblogs.com/lex-shoukaku/p/13259804.html
Copyright © 2011-2022 走看看