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等符号(当然如果可以理解代码就更好了)

  • 相关阅读:
    在C#代码中应用Log4Net(二)典型的使用方式
    在C#代码中应用Log4Net(一)简单使用Log4Net
    Windows Azure Active Directory (2) Windows Azure AD基础
    Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
    Windows Azure Active Directory (1) 前言
    Azure China (6) SAP 应用在华登陆 Windows Azure 公有云
    Microsoft Azure News(3) Azure新的基本实例上线 (Basic Virtual Machine)
    Microsoft Azure News(2) 在Microsoft Azure上运行SAP应用程序
    Microsoft Azure News(1) 新的数据中心Japan East, Japan West and Brazil South
    Windows Azure HandBook (2) Azure China提供的服务
  • 原文地址:https://www.cnblogs.com/lex-shoukaku/p/13259804.html
Copyright © 2011-2022 走看看