MISC入门---编码
CTF新手入门:MISC中的编码与解码详解
前言
在CTF比赛中,MISC(杂项) 是一个“包罗万象”的类别,而其中最常见的考察点之一就是——编码与解码。
你是否遇到过这样的题目:
给你一串像 ZmxhZ3t5b3VfY2FuX2RlY29kZX19 的奇怪字符,说是“flag藏在里面”?
别慌!这其实就是一个 Base64 编码 的字符串。只要你会解码,就能轻松拿到 flag。通常在一场比赛中,可能会作为签到题出现
本文专为 CTF新手 设计,带你从零开始认识 MISC 中常见的编码方式,学会识别和解码技巧,让你在比赛中不再“见码发怵”。
什么是编码?为什么要学它?
✅ 编码 ≠ 加密
- 编码(Encoding):是为了方便传输或存储,把数据转换成另一种格式。没有保密性,只要知道规则就能还原。
- 比如:
Hello→SGVsbG8=(Base64)
- 比如:
- 加密(Encryption):是为了保密,需要密钥才能解开。
- 比如:AES、RSA
在CTF中,编码是“藏flag”的常用手段,属于“基本功”。除了签到题,编码大概率会作为一道MISC题目中的一部分,同时结合其他东西出现。
常见编码类型一览
下面这几种编码,90% 的 MISC 编码题都逃不开它们!
| 编码类型 | 特征 | 示例 |
|---|---|---|
| Base64 | 字符集:A-Z, a-z, 0-9, +, /, =补位 |
ZmxhZ3t0aGlzfQ== |
| Base32 | 字符集:A-Z, 2-7,用 = 补位 |
MZXW6YTBOI====== |
| Hex(十六进制) | 0-9, a-f,每两个字符表示一个字节 | 666c61677b6865787d |
| URL编码 | % 开头,如 %66%6c%61%67 |
%66%6c%61%67%7b...%7d |
| ASCII码 | 十进制或八进制数字表示字符 | 102 108 97 103 |
| Morse码(摩尔斯电码) | . 和 - 组成 |
..-. .-.. .- --. → flag |
| Unicode转义 | \u 开头,如 \u0066 |
\u0066\u006c\u0061\u0067 |
1. Base64 编码
特征:
- 包含
A-Z,a-z,0-9,+,/ - 结尾可能有
=或==(用于补位) - 长度通常是 4 的倍数
示例:
ZmxhZ3t0aGlzX2lzX2Jhc2U2NH0=
🔧 解码方法:
方法一:命令行(Linux/Mac)
echo "ZmxhZ3t0aGlzX2lzX2Jhc2U2NH0=" | base64 -d
# 输出:flag{this_is_base64}
方法二:Python
import base64
encoded = "ZmxhZ3t0aGlzX2lzX2Jhc2U2NH0="
decoded = base64.b64decode(encoded).decode('utf-8')
print(decoded) # flag{this_is_base64}
注意:有时 Base64 是多次编码的,比如编码了3层,需要循环解码。
2. Base32 编码
特征:
- 只使用
A-Z和2-7 - 用
=补位 - 常用于 Google Authenticator 或某些特殊场景
示例:
MZWGCZ33ORUGS427NFZV6YTBONSTGMT5```
### 解码方法:
#### Python(最方便)
```python
import base64
encoded = "MZWGCZ33ORUGS427NFZV6YTBONSTGMT5"
decoded = base64.b32decode(encoded).decode('utf-8')
print(decoded) # flag{base32_decoded}
注意:Base32 不区分大小写,但通常为大写。
3. Hex 编码(十六进制)
特征:
- 由
0-9和a-f(或A-F)组成 - 每两个字符表示一个字节
- 常见于二进制数据的文本表示
示例:
666c61677b6865785f656e636f64696e677d
🔧 解码方法:
Python
hex_str = "666c61677b6865785f656e636f64696e677d"
decoded = bytes.fromhex(hex_str).decode('utf-8')
print(decoded) # flag{hex_encoding}
命令行(使用 xxd)
echo "666c61677b6865785f656e636f64696e677d" | xxd -r -p
# 输出:flag{hex_encoding}
4. URL 编码
特征:
- 出现
%后跟两个十六进制数字 - 常见于网页参数中
示例:
%66%6c%61%67%7b%75%72%6c%5f%65%6e%63%6f%64%65%7d
解码方法:
Python
from urllib.parse import unquote
encoded = "%66%6c%61%67%7b%75%72%6c%5f%65%6e%63%6f%64%65%7d"
decoded = unquote(encoded)
print(decoded) # flag{url_encode}
在线工具
也可以使用在线解码网站快速解码,通常在浏览器搜索URL在线解码即可找到。
5. ASCII 码(十进制/八进制)
特征:
- 一串数字,可能是空格或逗号分隔
- 每个数字代表一个字符的ASCII值
示例(十进制):
102 108 97 103 123 97 115 99 105 105 95 100 101 99 125
解码方法:
Python
ascii_list = "102 108 97 103 123 97 115 99 105 105 95 100 101 99 125"
nums = map(int, ascii_list.split())
decoded = ''.join(chr(n) for n in nums)
print(decoded) # flag{ascii_dec}
小知识:
chr(102)→'f',ord('f')→102
6. Morse 码(摩尔斯电码)
特征:
- 由
.(点)和-(划)组成 - 字母之间用空格分隔,单词用
/或|分隔
示例:
..-. .-.. .- --. ---... -- --- .-. ... .
🔧 解码方法:
手动对照表(常用字符):
| 字符 | Morse |
|---|---|
| A | . - |
| B | - . . . |
| C | - . - . |
| F | . . - . |
| L | . - . . |
| G | - - . |
| O | - - - |
| : | - - - . . . |
上面例子解码为:FLAG: MORSE
Python(使用 morse 库)
pip install morse
from morse import MorseCode
morse = "..-. .-.. .- --. ---... -- --- .-. ... ."
decoded = MorseCode().decode(morse)
print(decoded) # FLAG:MORSE
当我们看见摩斯密码的时候,通常使用在线解码网站进行解码
7. Unicode 转义
特征:
- 出现
\u开头的四字符编码 - 常见于JSON、JavaScript中
示例:
\u0066\u006c\u0061\u0067\u007b\u0075\u006e\u0069\u0063\u006f\u0064\u0065\u007d
🔧 解码方法:
Python
encoded = "\\u0066\\u006c\\u0061\\u0067\\u007b\\u0075\\u006e\\u0069\\u0063\\u006f\\u0064\\u0065\\u007d"
decoded = encoded.encode().decode('unicode_escape')
print(decoded) # flag{unicode}
注意:字符串中的
\u要写成\\u,否则会被Python提前解析。
多层编码:嵌套才是常态!
在真实CTF中,很少有单层编码。出题人喜欢“套娃”:
示例:
flag→ Base64 → Hex → URL编码
典型套娃流程:
flag{nested_encoding}
→ Base64: ZmxhZ3tuZXN0ZWRfZW5jb2Rpbmd9
→ Hex: 5a6d78615a37746e4e58533252677746526764434f69647a5a57566864434171
→ URL: %5a%6d%78%61%5a%37%74%6e%4e%58%53%32%52%67%77%46%52%67%64%43%4f%69%64%7a%5a%57%56%68%64%43%41%71
解题思路:
- 看到
%→ 先 URL 解码 - 得到一串
a-f0-9→ 尝试 Hex 解码 - 得到
Zmxh...→ 看起来像 Base64 → 再解一次 - 最终得到 flag!
实战小练习
题目1:
SGVsbG8sIGZsYWd7YmFzZTY0X3R3aWNlfQ==
👉 提示:看起来像 Base64?试试解码!
💡 答案(点击展开)
echo "SGVsbG8sIGZsYWd7YmFzZTY0X3R3aWNlfQ==" | base64 -d
# 输出:Hello, flag{base64_twice}
题目2:
666c61677b6865785f616e645f75726c7d
👉 提示:全是 a-f 和 0-9,先 Hex 解,再看内容。
💡 答案(点击展开)
bytes.fromhex("666c61677b6865785f616e645f75726c7d").decode()
# 输出:flag{hex_and_url}
新手必备工具清单
强烈推荐 CyberChef!拖拽操作,支持自动识别和链式解码,非常适合新手。
https://cyberchef.cn/
总结:编码题解题流程
- 观察输入:看字符集,判断可能的编码类型
- 尝试 strings / file 命令:提取可读信息
- 逐层解码:从外到内,像剥洋葱
- 善用工具:CyberChef 是你的最佳伙伴
- 多练多总结:记下常见编码特征
(https://esolangs.org/wiki/Language_list 一个收录了世界上大多数语言的网站)
写在最后
编码是CTF的“敲门砖”,看似神秘,其实规则明确。只要你掌握了几种常见编码的识别与解码方法,就能解决大多数MISC中的编码题。
记住:每一个“看不懂”的字符串,背后都可能藏着一个flag。
从今天开始,拿起Python,打开CyberChef,开始你的解码之旅吧!
Happy Decoding!🔓
祝你在CTF中旗开得胜!🚩

浙公网安备 33010602011771号