base64基本原理

他可以将8位字节转化成6位字节。用等式3*8==4*6

将3个字节3个字节的数化成一组,然后将这组数据化成6个字节6个字节的4个小组,每6个字节的高位用00填充。

数据的大小会变大 数据大小会变为原来的4/3,

38 * 8 = x *6

x = 38*8/6

CTF题

1.直接的base编码

当字符串中有只有ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=的时候就可能是单词的base64编码

2.base64换表的操作

当你在使用IDA的时候 利用shift + F12 看字符串的时候,如果看到类似于base64字符集的东西,可能会有换表的操作。

比如出现:0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

这种和base64字符集很相似,但是顺序有改变的时候就很有可能会使用

用python脚本解密

1
2
3
4
5
6
7
8
9
import base64
import string

str1 = "eyD4sN1Qa5Xna7jtnN0RlN5i8lO=" # 需要换表的字符串
string1 = "0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" #IDA中看到的表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #IDA中看到的表
c = str.maketrans(string1,string2)
print(str1.translate(c))#只进行换表
print(base64.b64decode(str1.translate(str.maketrans(string1,string2))))#附带解密

3.base64 返回数据

1
2
3
4
5
6
7
8
9
import base64
def decode2(encoded_str):
decoded_bytes = base64.b64decode(encoded_str)
decoded_str = decoded_bytes.decode()
return [ord(t) for t in decoded_str]

b = b'IMKJw4jCkgQxw6A1w5QRw7A5SG14wobDs8KF'
a = decode2(b)
print(a)