0x00 题目概述CryptoHack 的 Encoding Challenge 是一道综合编码自动化闯关题分值 40 分考察多种常见编码解码 pwntools 交互式 socket 脚本编写。基础信息靶机地址socket.cryptohack.org 13377配套文件服务端源码13377.py、pwntools 交互模板任务要求连续通过 100 层随机编码挑战全部答对输出 flag服务器每轮输出编码类型 密文我们需要自动化识别编码、解码明文并回传100 轮全部正确即可拿到 flag。0x01 涉及编码类型分析阅读服务端源码后确定一共 7 种循环随机出现的编码Hex 十六进制Base64ASCII 数字数组逗号分隔数字Rot13 凯撒移位 13BigInt 十进制大数转字节URL 百分号编码UTF-16LE 小端 Unicode 编码每种编码对应专属解码逻辑是解题核心。0x02 环境搭建依赖 pwntools 做 socket 交互一键安装依赖pip install pwntools0x03 完整解题 EXPfrom pwn import * import base64 import urllib.parse import codecs io remote(socket.cryptohack.org, 13377) def decode_all(encode_type: str, data: str) - str: match encode_type: case hex: return bytes.fromhex(data).decode() case base64: return base64.b64decode(data).decode() case ascii: nums list(map(int, data.split(, ))) return .join([chr(n) for n in nums]) case rot13: return codecs.encode(data, rot_13) case bigint: big_num int(data) hex_str hex(big_num)[2:] if len(hex_str) % 2 ! 0: hex_str 0 hex_str return bytes.fromhex(hex_str).decode() case url: return urllib.parse.unquote(data) case utf16: return bytes.fromhex(data).decode(utf-16le) case _: log.error(f未知编码: {encode_type}) return # 循环闯100关 for i in range(100): log.info(f第{i1}/100层) io.recvuntil(bType: ) enc_t io.recvline().strip().decode() io.recvuntil(bEncoded: ) enc_d io.recvline().strip().decode() plaintext decode_all(enc_t, enc_d) log.success(f解码结果{plaintext}) io.sendline(plaintext.encode()) io.recvline() # 获取最终flag flag io.recvall().decode() print(f[] Flag: {flag}) io.close()0x04 核心解码逻辑详解1. Hex 解码直接使用bytes.fromhex()将十六进制字符串转为二进制字节再 utf-8 解码得到明文。2. Base64 解码标准 base64 库解码适配常规 Base64 字符串。3. ASCII 数字数组输入样例99, 114, 121, 112, 116, 111以,分割数字每个数字用chr()转为字符后拼接。4. Rot13Python 内置 codecs 库直接处理无需手动字母移位大小写自动兼容。5. BigInt 大数解码十进制数字转十六进制若十六进制字符串长度为奇数开头补 0防止fromhex报错再转字节解码。6. URL 编码urllib.parse.unquote自动解析%XX格式的 url 转义字符。7. UTF16-LE服务器给出密文是 UTF16 二进制的十六进制表示先转 bytes再用小端 utf16 解码。0x05 解题踩坑记录BigInt 奇数长度报错十六进制必须两位一组单数长度会抛出异常需要前置补 0ASCII 分割符是逗号 空格仅用,分割会残留空格int 转换失败UTF16 不能直接 decode 字符串必须先 fromhex 转二进制IO 读取必须精准匹配recvuntil否则读取错位编码类型识别错误答案必须用sendline()发送自带换行符send()会导致服务器不识别输入。0x06 运行与 Flag执行脚本后程序自动逐层解密交互100 轮全部完成后输出 flagpython3 solve.py终端打印[] Flag: crypto{xxxxxxx}即为本题答案。0x07 总结拓展这道题是 CTF 编码入门经典题熟练掌握后可以迁移到所有同类交互式编码闯关题型有服务端源码优先读源码提前枚举全部加密类型pwntoolsremote长连接是自动化交互最优方案针对每种编码单独封装解码函数便于调试和扩展日志分级打印快速定位解码出错的关卡。