前言
在 HTB(Hack The Box)的 General 栏目中,Encoding板块下的 ASCII 是密码学最基础的入门题型,主要考察对ASCII 编码的理解,利用十进制 ASCII 码值还原原始字符串,本篇文章完整梳理题目原理、解题思路、实操代码与知识点拓展。
一、题目分析
题目原文
ASCII is a 7-bit encoding standard which allows the representation of text using the integers 0–127. Using the below integer array, convert the numbers to their corresponding ASCII characters to obtain a flag. 数组:
[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 119, 116, 52, 98, 108, 51, 125]提示:Python 中chr()可以将 ASCII 数值转为字符,ord()实现反向转换。
基础概念梳理
- ASCII:美国信息交换标准代码,采用 7 位二进制编码,取值范围十进制
0 ~ 127,每一个数字唯一对应一个可打印 / 不可打印字符,字母、数字、英文标点都被收录在内。 - 两个 Python 核心内置函数
chr(n):接收十进制整数,返回对应的 ASCII 字符,本题核心函数。ord(c):接收单个字符,返回其对应的十进制 ASCII 码,为逆向操作。
二、解题过程
方法 1:Python 代码批量转换(推荐)
将给出的数字数组遍历,逐个使用chr()进行转换,最后拼接所有字符得到 Flag,完整代码如下:
# 定义ASCII十进制数组 ascii_arr = [99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 119, 116, 52, 98, 108, 51, 125] # 遍历数组转换字符并拼接字符串 flag = "".join([chr(num) for num in ascii_arr]) # 输出最终flag print(flag)运行代码后输出结果:crypto{ASCII_pr1wt4bl3}
方法 2:在线 ASCII 解码器(新手快速解法)
如果暂时不会编写 Python 代码,可以直接使用在线 ASCII 十进制转字符工具,将全部数字粘贴进输入框,一键解码即可拿到 Flag,适合零基础快速通关。
手动查表(不推荐)
可以对照 ASCII 编码表,逐个查询每一个十进制数字对应的字符,缺点是数组元素较多,效率低,很容易出现人为失误,仅用来理解原理即可。
三、结果解析
最终得到的 flag:crypto{ASCII_pr1wt4bl3}拆解字符串可以直观验证编码逻辑:
crypto{对应数组前 7 位数值ASCII_pr1wt4bl3}为花括号内部的密码字符串,数字1、4、3用来替换字母,是 CTF 题目里很常见的变形手法。
四、知识点拓展
- 反向题型:给出字符串,获取 ASCII 码,使用
ord()实现,示例代码
s = "crypto" res = [ord(i) for i in s] print(res) # 输出 [99, 114, 121, 112, 116, 111],和本题数组开头完全对应- 区分 ASCII 与 Hex(十六进制)页面下方紧接着 Hex 题型,十六进制是将 ASCII 十进制转为 16 进制表示,例如字符
c十进制为 99,转为十六进制就是63,后续可以用bytes.fromhex()在 Python 中解码十六进制字符串。 - 拓展小知识:标准 ASCII 为 7bit,拓展 ASCII 使用 8bit,取值范围
0~255,可以收录西欧字符,而中文无法使用 ASCII 编码,需要 GBK、UTF-8 等编码格式。
五、做题总结
这道 HTB ASCII 编码题是 CTF 密码学的敲门砖,核心只需要记住chr()和ord()两个函数,理解数字和字符的映射关系。后续很多编码类题目(十六进制、Base 系列编码)都是在 ASCII 的基础上衍生而来,吃透本题能够为后续编码类题型打下扎实基础。