📌 题目信息
| 项目 | 内容 |
|---|---|
| 题目名称 | [BJDCTF2020]这是base?? |
| 题目来源 | BUUCTF(BJDCTF 2020) |
| 题目类型 | Crypto(密码学) |
| 子分类 | Base系列(自定义Base64码表/换表) |
| 考点 | Base64编码原理、自定义索引表替换 |
| 难度 | ⭐⭐ |
| 最终 Flag | flag{D0_Y0u_kNoW_Th1s_b4se_map} |
🛠️ 使用工具
- Python —— 编写换表解码脚本(或使用 CyberChef)
📝 解题思路
题目名为“这是base??”,附件中给出了一个
dict字典和一个密文。dict的键为 0~63 的数字,值为对应的字符——这实际上是一个被打乱顺序的 Base64 码表。解题的核心思路是:先将密文中的每个字符在自定义码表中找到对应的数字索引,再用这些索引去标准 Base64 码表中取出对应的字符,从而将密文“还原”为标准 Base64 编码,最后用 Python 的base64.b64decode()解码即可。
第 1 步:分析题目附件
打开题目附件,发现包含两部分内容:
- 一个
dict字典:定义了 0~64 对应的自定义字符,例如0: 'J'、1: 'K'、2: 'L'…… - 一段密文:
FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw
将 dict 中 0~63 对应的字符按顺序拼接,得到自定义 Base64 码表:
JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/
而标准 Base64 码表为:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
第 2 步:理解“换表”原理
Base64 编码的原理是:将数据按 6 个 bit 一组分组,每组得到一个 0~63 的数字索引(因为2的6次方等于64),然后去码表中取对应字符。
本题中,编码时使用了被打乱的自定义码表,但编码过程中产生的数字索引(0~63)本身没有变。因此,我们只需要:
- 在自定义码表中找到密文每个字符的位置(即数字索引)
- 用这些数字索引去标准码表中取出对应的字符
- 得到标准 Base64 编码字符串
- 用 Python 的
base64.b64decode()解码
⚠️ 注意:
dict中键64对应的是'=',这是 Base64 的填充符,在码表转换时也需要一并处理。
第 3 步:编写 Python 解码脚本
import base64
# 自定义码表(从dict中提取)
dict_custom = {
0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y',
8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E',
16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q',
24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g',
32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X',
40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5',
48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q',
56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/',
64: '='
}
# 标准 Base64 码表
standard_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
# 将自定义码表转为字符串(便于查找索引)
custom_str = ''.join([dict_custom[i] for i in range(65)])
# 密文
cipher = 'FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'
# 步骤1:将密文中的每个字符在自定义码表中找到索引,再用标准码表替换
standard_cipher = ''
for ch in cipher:
index = custom_str.index(ch) # 在自定义码表中找位置
standard_cipher += standard_table[index] # 用标准码表替换
print('还原后的标准Base64:', standard_cipher)
# 步骤2:标准 Base64 解码
flag = base64.b64decode(standard_cipher).decode('utf-8')
print('解码结果:', flag)

⚠️ 注意:运行脚本后,会先输出还原后的标准 Base64 字符串
QkpEe0QwX1kwdV9rTm9XX1RoMXNfYjRzZV9tYXB9,再输出解码结果。
第 4 步:获取 Flag
运行脚本,得到解码结果:
BJD{D0_Y0u_kNoW_Th1s_b4se_map}
⚠️ 注意:原题解码结果的前缀是
BJD{},提交到 BUUCTF 时需要将前缀替换为flag{}。
🏁 最终 Flag
flag{D0_Y0u_kNoW_Th1s_b4se_map}
【Base系列】BJDCTF2020 这是base??&spm=1001.2101.3001.5002&articleId=163751016&d=1&t=3&u=796089310db84a73928b89bf5c1f7385)

被折叠的 条评论
为什么被折叠?



