ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ctf-wiki 计算机编码全解析:从字母表到 Base64 隐写的 CTF 解码实战指南

ctf-wiki 计算机编码全解析:从字母表到 Base64 隐写的 CTF 解码实战指南 文档网络安全教程【免费下载链接】ctf-wikiCome and join us, we need you!项目地址https://gitcode.com/gh_mirrors/ct/ctf-wiki点击查看免费下载导读本文基于 ctf-wiki 开源知识库中 Misc杂项分类的“计算机相关编码”专题文档系统梳理 CTF 赛题中最高频出现的字母表编码、ASCII 编码及其二进制/十六进制变形、Base64/Base32 编码原理与隐写手法并延伸覆盖霍夫曼编码、XXencoding、URL 编码、Unicode 与 HTML 实体编码。读完本文你将掌握一套从“识别编码特征”到“编写脚本解码”的完整方法论能够独立拆解同类 Misc 编码题。在 ctf-wiki 中的定位Misc → Encode 板块的核心内容ctf-wiki 将 Misc 分类划分为 Recon信息搜集、Encode编码转换、Forensic Stego数字取证与隐写分析等板块其中Encode编码转换板块专门“介绍在 CTF 比赛中一些常见的编码形式以及转换的技巧和常见方式”见 Misc 简介。从导航配置 docs/zh/mkdocs.yml 可以看出Encode 板块由三个文档组成通信领域常用编码电话拨号编码、Morse 摩尔斯电码、敲击码、曼彻斯特编码、格雷编码计算机相关编码本文主体即docs/zh/docs/misc/encode/computer.md现实世界中常用的编码条形码、二维码同时取证隐写前置技术 明确把“了解常见的编码”列为前置技能要求“对 Base64、十六进制、二进制等有一定的敏感度对其进行转换并得到最终的 flag”——这正是本文要训练的核心能力看到一串字符先判断它属于哪类编码再选择正确的解码路径。字母表编码一切编码的起点字母表编码是 CTF 中最朴素也最容易被忽视的编码方式其规则非常简单A-Z/a-z分别对应1-26或0-25这类编码经常以“字母序号”的形态隐藏在题目中例如把密文中的字母替换成它在字母表中的位置序号。实战中需要同时尝试1-26A1与0-25A0两种映射因为题目作者可能采用任一种约定且两种方案得到的明文完全不同。该知识点也是后续理解 ASCII 码数值范围A65的重要铺垫。ASCII 编码ASCIIAmerican Standard Code for Information Interchange是计算机领域最基础的字符编码CTF 编码题中几乎无处不在。ASCII 码表完整地给出了 0-127 数值与字符的一一对应关系见 ASCII 码表配图。可打印字符的范围特征CTF 中使用的 ASCII 编码绝大多数是可见字符主要集中于以下三段区间这也是识别 ASCII 编码的关键特征字符范围十进制码值0-948-57A-Z65-90a-z97-122当你在题目中看到“一串数字且每个数字都落在 32-126 之间”时第一反应就应该是 ASCII 十进制编码看到“0x开头的十六进制串码值落在上述区间”时则是 ASCII 十六进制编码。变形一二进制编码将 ASCII 码对应的十进制数字直接换成二进制表示就得到 ASCII 的二进制编码特征如下只包含0和1两种字符每个码值不超过 8 位由于可见字符最大到 127一般 7 位即可本质上是 ASCII 编码的另一种表示形式解码时只需将二进制转十进制、再查 ASCII 表即可。实战中常见陷阱二进制的分组可能按 7 位或 8 位划分若按 8 位分组得到的结果乱码可尝试改为 7 位分组重新解码。变形二十六进制编码将 ASCII 码对应的十进制数字换成十六进制表示即得到十六进制编码A-Z→0x41 ~ 0x5Aa-z→0x61 ~ 0x7A十六进制编码在题目中通常以48656c6c6f对应Hello这类形态出现可能带0x前缀、也可能不带可能连续成串、也可能用空格或\x分隔解码时都应先去除前缀与分隔符再整体转换。识别工具与转换手段各类在线 ASCII 转换工具支持 ASCII ↔ 数字/二进制/十六进制互转也支持批量转换编程语言内置函数Python 中ord()取字符码值、chr()取码值对应的字符配合bin()、hex()、int(x, 2)、int(x, 16)即可完成各进制互转。下图演示了一个典型场景将文本thisisencodedwithascii.分别转换为十六进制、十进制、二进制形式的 ASCII 编码见 ASCII 编码实例配图这也是多数 CTF 题目给题的形态——题目给你其中一种形式要求还原原文。实战例题2018 DEFCON Quals ghettohackers: Throwback题目给出如下密文Anyo!e!howouldsacrificepo!icyforexecu!!onspeedthink!securityisacomm!ditytop!urintoasy!tem!第一直觉是补全这些叹号对应的字母从而得到 flag但补全后并不成立。换个思路把源字符串按照!分割然后字符串长度 1 对应字母 a、长度 2 对应字母 b以此类推即用每个被叹号分隔的片段的长度来表示字母序。解码脚本如下ori Anyo!e!howouldsacrificepo!icyforexecu!!onspeedthink!securityisacomm!ditytop!urintoasy!tem! sp ori.split(!) print repr(.join(chr(97 len(s) - 1) for s in sp))这里split(!)会把连续的叹号如!!和末尾叹号切出空字符串空字符串长度 0 按上述公式会得到chr(96)反引号。因此还需要做一个修正假设0 个字符对应空格。经过该修正后原文才可读最终解出dark logic即本题的答案。这个例子很好地说明编码题的突破口往往不在“补全缺失字符”而在“重新定义字符的组织方式”——见到分隔符优先尝试按分隔符切分后分析各部分的结构特征。同类题目可练习 Jarvis OJ 的 Basic 分类下的“德军的密码”。Base 编码家族Base 编码是 Misc 编码题中出现频率最高的一类其核心思想是用有限个可见字符构成的字符集把原始二进制数据重新编码为可打印文本。“base xx 中的 xx 表示采用多少个字符进行编码”。Base64 编码原理Base64 采用以下 64 个字符进行编码对应关系见 Base64 编码字符表大写字母A-Z26 个、小写字母a-z26 个、数字0-910 个共 62 个另有 2 个可打印符号在不同系统中略有差异常用的是与/末尾可能出现的用作填充符padding不属于数据本身。由于2^6 64Base64 以6 个比特为 1 个单元对应 1 个可打印字符。3 个字节共有 24 个比特正好划分为 4 个 Base64 单元即3 个字节需要用 4 个可打印字符表示。以编码MAN为例完整流程为取每个字符的 ASCII 值M77, a97, n110→ 拼接成 24 位连续二进制 → 按每 6 位拆分为 4 组索引 → 查表得到TWFu。这一转换链条字符 → ASCII 十进制 → 二进制 → 6bit 分组 → 查表是理解 Base64 的基石。Base64 最初被用作电子邮件的传输编码如今在网络传输、数据序列化、CTF 题目中普遍使用。Base64 的补位Padding规则当待编码的字节数不能被 3 整除时最后会多出 1 个或 2 个字节处理方式如下见 Base64 补零填充规则配图先用0值在末尾补足使总比特数能够被 6 整除编码完成后在 Base64 文本末尾追加号的数量代表补足的字节数最后剩余1 个八位字节1 byte该字节的 8 位二进制补零至 12 位最后一个 6 位的 Base64 块中有 4 位是补的 0末尾附加两个最后剩余2 个八位字节2 bytes16 位二进制补零至 18 位最后一个 6 位的 Base64 块中有 2 位是补的 0末尾附加一个。由此可知Base64 结尾最多只有 2 个。更关键的是——由于解码时补位的 0 并不参与实际运算这些“被补出来的无效位”可以被用来隐藏信息这正是下文 Base64 隐写的原理基础。Base32 编码与 Base64 类似Base32 使用32 个可见字符进行编码A-Z与2-7。由于2^5 32每5 bit 为 1 个分组5 个字节为 40 bit正好对应 8 个 Base32 分组即5 个字节用 8 个字符表示。若输入不足 5 个字节填充规则如下第一个不足 5 bit 的分组用0补足 5 bit后面剩余的分组全部用填充直到补满 5 个字节。因此Base32 结尾最多出现 6 个例如 1 字节输入编码后末尾有 6 个等号。特点速查实战识别清单综合 Base64 与 Base32总结出以下实战识别特征Base64 结尾可能会有但最多 2 个Base32 结尾可能会有但最多 6 个根据 base 的不同16/32/58/64/85……字符集会有所限制可通过“出现了哪些字符、没出现哪些字符”反推编码类型有可能需要自己加等号题目给的数据可能删除了填充符解码前需按长度手动补齐也就是3D在十六进制或 URL 编码语境中0x3D或%3D都表示字符看到3D要联想到等号这常是嵌套编码题的关键线索编码标准的更多细节可参考 RFC 4648Base16/32/64 的官方规范。工具各类在线 Base64/Base32 转换工具支持加解密、带填充/去填充选项Python 标准库base64模块b64encode/b64decode/b32encode/b32decode等便于批量处理与脚本化解码针对 Base64 隐写可参考社区提供的隐写信息读取脚本思路见下文示例代码。实战例题Base64 隐写Stego本题题目数据位于 ctf-wiki 配套的 ctf-challenges 题库中misc/encode/computer/base64-stego目录下的data.txt内容为一长串 Base64 密文需要利用补 0 位隐藏信息的手法提取 flag。原理回顾Base64 解码时末尾补位的 0 不参与运算因此可以用这些无效位携带额外比特。对于每行 Base64 文本若末尾有2 个说明最后一个有效字符的 6 位中有4 位是补 0可取后 4 位作为隐藏信息若末尾有1 个说明最后一个有效字符的 6 位中有2 位是补 0可取后 2 位作为隐藏信息把这些低位比特拼接起来每 8 位还原成一个 ASCII 字符即可得到 flag。读取隐写信息的 Python 脚本如下import base64 def deStego(stegoFile): b64table ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/ with open(stegoFile,r) as stegoText: message for line in stegoText: try: text line[line.index() - 1:-1] message .join([ bin( 0 if i else b64table.find(i))[2:].zfill(6) for i in text])[2 if text.count() 2 else 4:6] except: pass return .join([chr(int(message[i:i8],2)) for i in range(0,len(message),8)]) print(deStego(text.txt))脚本逻辑拆解line.index()定位每行第一个往前取最后一个有效字符用b64table.find(i)把该字符转回 6 位索引值若该行有 2 个等号则截取低 4 位、有 1 个等号则截取低 2 位逐行累积后按 8 位一组还原为字符。运行输出flag{BASE64_i5_amaz1ng}补充说明文档原编辑者最初的脚本用last line[-3]写死了字符位置默认每行末尾都带一个\n而最后一行并无换行符导致最后一个字符解析错误、输出为flag{BASE64_i5_amaz1ng~。这个细节提醒我们处理文本文件的最后一行时务必考虑换行符的缺失否则可能“功亏一篑”。霍夫曼编码霍夫曼编码Huffman Coding是一种依据字符出现频率构造前缀码的无损压缩编码出现频率越高的字符分配的编码越短。它在 CTF 中较少单独成题但偶尔会以“给出字符频率与编码树要求解码二进制串”的形式出现。其核心特征是没有哪个字符的编码是另一个字符编码的前缀解码时从根节点沿树遍历即可唯一确定字符序列。XXencodingXXencode 与 Base64 同属“二进制转可见字符”的编码族规则如下将输入文本每三个字节为单位进行编码最后剩余不足三个字节的部分用零补齐。这三个字节共 24 个 Bit以 6 bit 为单位分成 4 个组每组以十进制表示数值只会落在 0-63 之间再以该值对应位置上的字符代替。其字符表为1 2 3 4 5 6 0123456789012345678901234567890123456789012345678901234567890123 | | | | | | | -0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz特点字符集只有数字、大小写字母额外包含号表头第一字符值 0 对应与-号。识别特征一段包含-与字母数字、且明显不是 Base64 字符集无/且无填充规律的文本可尝试 XXencode 解码。常用工具为各类在线 XXencode/XXdecode 转换器。URL 编码URL 编码又称百分号编码用于在 URL 中安全表示非 ASCII 字符与保留字符其规则是把字符的字节值写成%后跟两位十六进制数。特点大量百分号是 URL 编码最直观的识别特征如%41%42%43即ABC与上文呼应%3D就是ASCII 0x3D%20是空格%0A是换行。CTF 中 URL 编码常作为多重编码的最外层包裹出现内层可能是 Base64、十六进制等逐层剥开即可。Unicode 编码Unicode 为全球所有字符分配了统一的码点CTF 中需要注意它有四种常见的表现形式见到以下任意形态都应想到 Unicode 解码形式示例源文本The#x[Hex]#x0054;#x0068;#x0065;#[Decimal]#00084;#00104;#00101;\U[Hex]\U0054\U0068\U0065\U[Hex]\U0054\U0068\U0065注意The的三个字符码点为U0054、U0068、U0065前导零的位数可能不同如十进制形式补足 5 位解码时应灵活处理。HTML 实体编码HTML 实体HTML Entity编码用实体引用的方式表示字符包括命名实体如amp;表示与数值字符引用如#65;表示A、#x41;表示十六进制形式的A。它与上文的 Unicode 数值引用形式#x...;/#...;高度重叠识别特征是分号结尾的实体引用可直接用 HTML 解码工具或 Python 的html模块还原为原文。小结编码识别的通用方法论综合 ctf-wiki 本文档的全部内容面对一道 Misc 编码题推荐按以下流程排查看字符集只有 0/1 → 二进制尝试 ASCII 按 7/8 位分组、甚至 Base64 的 0/1 变体只有十六进制字符 → 十六进制先查 ASCII 码值范围字母数字/→ Base64字母数字-→ XXencode看等号末尾的个数直接区分 Base64≤2 个与 Base32≤6 个看特殊符号大量%→ URL 编码#...;或\U...→ Unicode/HTML 实体大量./-→ 摩尔斯见通信领域常用编码看分隔符存在统一分隔符时优先尝试按分隔符切分后分析各片段的结构关系如 Throwback 题按!切分取长度警惕嵌套多重重叠编码需逐层剥离注意与3D、%与十六进制之间的等价关系留意隐写Base64 末尾的补 0 位可能携带隐藏信息必要时逐行检查低位比特。编码类题目是 Misc 分类中最适合入门、也最能锻炼“模式识别”能力的题型上述方法论的完整导航与配套题目资料可在 ctf-wiki 的 Misc 简介 与 取证隐写前置技术 中继续深入。赞分享文档网络安全教程【免费下载链接】ctf-wikiCome and join us, we need you!项目地址https://gitcode.com/gh_mirrors/ct/ctf-wiki点击查看免费下载相关推荐ctf-wiki 计算机相关编码全解析ASCII、Base 系列隐写与 XX/Unicode 编码实战ctf wiki 计算机相关编码全解析ASCII、Base 系列隐写与 XX/Unicode 编码实战 在 CTF 的 Misc杂项分类中编码类题目始终文档网络安全教程JavaScript 课程中的 ES6 Class 语法从对象构造函数到类、继承与私有字段JavaScript 课程中的 ES6 Class 语法从对象构造函数到类、继承与私有字段 本文是 The Odin Project 开源全栈课程 READ文档网络安全教程CTF 古典密码全览单表替换、多表替换与趣味编码的破解实战ctf-wiki 知识库CTF 古典密码全览单表替换、多表替换与趣味编码的破解实战ctf wiki 知识库 古典密码学是 CTF 比赛中 Crypto 方向的基础考点之一本文基文档网络安全教程上一篇Flipper Zero 实战用 Sub-GHz 捕获文件复现 Mumbi 遥控插座432.92 MHz下一篇hindsight-crewai 0.4.20 技术解读为 CrewAI 智能体团队接入 Hindsight 持久记忆创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表