这是什么编码 - writeup by AI
这是什么编码 - writeup by AI 题目信息项目内容题目名称这是什么编码来源平台BUGKU CTF题目类型Crypto (密码学)核心考点Base 家族编码识别、多层嵌套解码涉及编码Hex、Base32、Base64 题目描述给定的密文文件encode.txt中包含一串经过多重编码的字符串需要通过分析和解码最终提取出隐藏的 flag。原始密文前 100 字符4b5a4b455536534e4b5a48454f56334f4a5a4b57455232534b564b464d5754584b524c4655574445493544464f544b5647...密文总长度2560 个字符 考点分析1. 主要考点编码特征识别通过字符集和长度特征判断编码类型多层解码能力理解编码可以嵌套使用耐心与细心需要多次迭代解码2. 涉及的编码知识十六进制编码 (Hex)特征说明字符集0-9, A-F(16 个字符)长度特征偶数Padding无压缩比2:1 (编码后长度翻倍)Base32 编码特征说明字符集A-Z, 2-7(32 个字符)长度特征8 的倍数Padding(最多 6 个)压缩比8:5 ≈ 1.6:1Base64 编码特征说明字符集A-Z, a-z, 0-9, , /(64 个字符)长度特征4 的倍数Padding(最多 2 个)压缩比4:3 ≈ 1.33:1 解题思路整体策略观察特征分析密文的字符组成和长度初步判断根据特征推测编码类型逐层解码从外层到内层依次解码循环检测每次解码后检查是否出现 flag记录路径保存完整的解码过程编码嵌套逻辑原始数据 ↓ [Hex 编码] Hex 密文 (2560 字符) ↓ [Base32 编码] Base32 密文 (1280 字符) ↓ [Base64 编码] Base64 密文 #1 (800 字符) ↓ [Base64 编码] Base64 密文 #2 (600 字符) ↓ [Base64 编码] Base64 密文 #3 (448 字符) ↓ [Base32 编码] Base32 密文 #4 (336 字符) ↓ [Base32 编码] Base32 密文 #5 (208 字符) ↓ [Base64 编码] Base64 密文 #6 (128 字符) ↓ [Base32 编码] Base32 密文 #7 (96 字符) ↓ [Base64 编码] Base64 密文 #8 (56 字符) ↓ [Base32 编码] Base32 密文 #9 (40 字符) ↓ [解码] Flag (23 字符) 详细解题步骤Step 1: 初始密文分析输入原始密文2560 字符特征分析✅ 只包含字符0-9和A-F✅ 长度为偶数2560✅ 符合十六进制编码特征判断这是十六进制编码 (Hex)操作decodedbytes.fromhex(cipher).decode(utf-8)结果解码后长度1280 字符压缩比2:1新密文特征只包含A-Z和2-7Step 2: Base32 解码输入Step 1 的结果1280 字符特征分析✅ 只包含大写字母A-Z和数字2-7✅ 长度能被 8 整除1280 % 8 0✅ 符合 Base32 编码特征判断这是Base32 编码操作padding(8-len(s)%8)%8# 计算 paddingdecodedbase64.b32decode(s*padding).decode(utf-8)结果解码后长度800 字符压缩比1.6:1新密文特征包含大小写字母、数字可能是 Base64Step 3: 第一次 Base64 解码输入Step 2 的结果800 字符特征分析✅ 包含大小写字母和数字✅ 长度能被 4 整除800 % 4 0✅ 符合 Base64 编码特征判断这是Base64 编码操作padding(4-len(s)%4)%4decodedbase64.b64decode(s*padding).decode(utf-8)结果解码后长度600 字符压缩比1.33:1仍然是 Base64 编码特征Step 4-5: 连续 Base64 解码继续对 Step 3 的结果进行 Base64 解码Step 4输入600 字符输出448 字符仍然是 Base64 编码Step 5输入448 字符输出336 字符变化不再符合标准 Base64 特征Step 6: Base32 解码关键转折输入Step 5 的结果336 字符特征分析✅ 只包含大写字母和部分数字2-7❌ 长度不能被 4 整除336 % 4 0但字符集不符合 Base64✅ 符合 Base32 特征判断切换回Base32 编码操作padding(8-len(s)%8)%8decodedbase64.b32decode(s*padding).decode(utf-8)结果解码后长度208 字符仍然是 Base32 编码特征Step 7: 再次 Base32 解码输入Step 6 的结果208 字符操作继续使用 Base32 解码结果解码后长度128 字符变为 Base64 编码特征Step 8-11: 交替解码按照以下顺序继续解码步骤编码类型输入长度输出长度压缩比8Base64128961.33:19Base3296561.71:110Base6456401.4:111Base3240231.74:1Step 12: 发现 Flag输入Step 11 的结果23 字符检查结果ifflag{incurrent.lower():print(✓ 找到 Flag!) 完整解题代码#!/usr/bin/env python3# -*- coding: utf-8 -*-importbase64fromdatetimeimportdatetimedefanalyze_string(s,step_name):分析字符串的特征信息print(f\n{*70})print(f[{step_name}] 字符串特征分析)print(*70)# 基本信息print(f长度{len(s)}字符)print(f长度 % 4:{len(s)%4}(Base64 要求))print(f长度 % 8:{len(s)%8}(Base32 要求))# 字符集分析unique_charssorted(set(s.replace(,)))char_set.join(unique_chars)print(f\n唯一字符数{len(unique_chars)})print(f字符集{char_set[:50]}{...iflen(char_set)50else})# 字符类型has_upperany(c.isupper()forcins)has_lowerany(c.islower()forcins)has_digitany(c.isdigit()forcins)has_only_hexall(cin0123456789ABCDEFabcdefforcins.replace(,))has_only_b32all(cinABCDEFGHIJKLMNOPQRSTUVWXYZ234567forcins.replace(,))print(f\n包含大写字母{是ifhas_upperelse否})print(f包含小写字母{是ifhas_lowerelse否})print(f包含数字{是ifhas_digitelse否})print(f\n编码匹配:)print(f Hex:{✓ifhas_only_hexelse✗})print(f Base32:{✓ifhas_only_b32else✗})print(f Base64:{✓if(has_upperorhas_lowerorhas_digit)else✗})deftry_decode_hex(s):try:returnbytes.fromhex(s).decode(utf-8)except:returnNonedeftry_decode_b32(s):try:cleans.replace(,)pad(8-len(clean)%8)%8returnbase64.b32decode(clean*pad).decode(utf-8)except:returnNonedeftry_decode_b64(s):try:pad(4-len(s)%4)%4returnbase64.b64decode(s*pad).decode(utf-8)except:returnNonedefsolve():start_timedatetime.now()print(*70)print(CTF 题目这是什么编码 - 详细解题过程)print(*70)# 读取密文withopen(encode.txt,r)asf:currentf.read().strip()step0path[]whilestep50:step1# 检查 Flagifflag{incurrent.lower():print(f\n{*70})print( 成功找到 Flag! )print(f{*70})print(f步数{step})print(f路径{ - .join(path)})print(f\nFlag:{current})break# Step 1: Hexifstep1:resulttry_decode_hex(current)ifresult:path.append(Hex)currentresult analyze_string(current,Step 1 - Hex 解码后)continue# 尝试 Base32resulttry_decode_b32(current)ifresult:path.append(Base32)currentresult analyze_string(current,fStep{step}- Base32 解码后)continue# 尝试 Base64resulttry_decode_b64(current)ifresult:path.append(Base64)currentresult analyze_string(current,fStep{step}- Base64 解码后)continuebreakend_timedatetime.now()print(f\n耗时{(end_time-start_time).total_seconds():.2f}秒)if__name____main__:solve() 经验总结1. 编码识别技巧编码类型快速识别方法Hex只有 0-9 和 A-F长度偶数Base32只有 A-Z 和 2-7可能有等号Base64有大小写字母、数字可能有/和等号 工具推荐在线工具CyberChef: https://gchq.github.io/CyberChef/Base64 在线解码: https://www.base64decode.org/多编码识别: https://www.dcode.fr/cipher-identifier
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2457802.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!