从0xGame开始的ctf之旅——编码基础

在我们打0xGame时,我们常常看到各种明显无实际意义的字符串,它们到底是什么呢?


什么是编码?

编码,是信息从一种形式或格式转换为另一种形式的过程,简单来讲就是语言的翻译过程。

ASCII码

在计算机中,机器语言是由0和1组成的二进制数。而我们要想与计算机交流,就必须要将0和1组成的二进制序列转化,ASCII码便应运而生。

ASCII码是较早使用的一个编码集,它将字符或命令对应为十进制数字,再转化为机器可以阅读的二进制序列,构建了机器语言和自然语言的桥梁。这一过程便被称为“编码”(Encode or Encrypt)

在将我们的信息更换编辑器处理时,我们常常遇到乱码(“锟斤拷”等)的现象,原因就是编码不一样

除了ASCII码,常见的UTF-8,GBK等等也是二进制转字符的常见编码。每种编码之间互不相容,因此转换时容易造成“锟斤拷”的现象。

除了将二进制转换为字符的编码,为了安全传输数据,我们还有以下在字符串之间转换的编码类型

base家族

提到编码,首先想到的就是base家族~

Base64,就是包括小写字母a-z、大写字母A-Z、数字0-9、符号”+”、”/”一共64个字符的字符集

base64是常见的编码类型,常用于各类协议传输,简单数据混淆和存储

ctf比赛中大多以简单题型出现或和其他复杂题型同时考察,是值得注意的编码类型

  • 原理:以最常见的“hello”举例,编码时,先将每个字符转换为对应的ASCII码(二进制):
字母    十进制数    二进制数
 h   ->  104  ->  01101000
 e   ->  101  ->  01100101
 l   ->  108  ->  01101100
 l   ->  108  ->  01101100
 o   ->  111  ->  01101111

再将二进制连接,形成一个长的二进制流;

0110100001100101011011000110110001101111

将其按照六个一组重新分组,余位补0,再转为十进制

并查阅base64编码表,即ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

转化为对应的编码字符

011010 = 26 -> a
000110 = 6  -> G
010101 = 21 -> V
101100 = 44 -> s
011011 = 27 -> b
000110 = 6  -> G
111100 = 60 -> 8

base64编码后编码字符数目必须是4的整数倍,为了补齐四的倍数位(即8位),最后一位补上0000000,编码为“=”

最终编码结果即为 aGVsbG8=

(是不是很神奇?)


注意到,因为base64以三个8位的二进制数作为一组,分为4个6位的二进制并转字符串,所以空余的数目不会大于2,即尾部的等号不会存在超过3个的情况。

因此base64的常见特征是:尾端带两个“==”(也可能是一个或者没有“=”)

同样的,base16,base32,base85等等也都是相似的操作,感兴趣的读者可以自行搜索了解

hex

HEX十六进制(Hexadecimal)的简称,是一种以 16 为基数 的计数系统。它使用数字 0-9 和字母 A-F(或小写 a-f)来表示数值,其中字母部分对应十进制的 10-15

hex直接转字符的情况比较少,但读者有必要熟悉,我们在以后的学习中还会遇到,这里不提前剧透

URL编码

URL编码是浏览器用于打包表单输入的编码格式,通过替换特殊字符确保数据可靠传输

URL 编码,也被称为百分号编码,是一种编码机制,用于将不安全或特殊的字符转换为%后跟其 ASCII 的十六进制表示,以确保 URL 的安全传输。

ctf中可能会出现多次编码的情况,识别标志是百分号和后面的数字

Unicode编码

又称“统一码”,对所有字符均可识别和编码

通常用于绕过对特殊字符的过滤

#对于字符串"helloworld",Unicode编码有以下不同形式:

# 默认模式
\u0068\u0065\u006C\u006C\u006F\u0077\u006F\u0072\u006C\u0064
# 宽字符
\u{68}\u{65}\u{6C}\u{6C}\u{6F}\u{77}\u{6F}\u{72}\u{6C}\u{64}
# 编码模式
U+0068 U+0065 U+006C U+006C U+006F U+0077 U+006F U+0072 U+006C U+0064
# HTML 实体 十进制
helloworld
# CSS 实体 十六进制
\0068\0065\006C\006C\006F\0077\006F\0072\006C\0064

摩尔斯电码

摩尔斯电码(Morse code)也被称作摩斯密码,是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

比如最近老乡鸡ctf的大众赛道就采取了这种编码方式

如图,两侧柱体的“长”“短”“空”代表着“—”“・”“ ”三种信号,组合后便可解码


编码内容的拓展

实际上,在广义的编码意义下,任何几个重复的字符都可以成为编码,因为它们的排列组合具有多样性,可以表示一个很大数量级的不同内容。

比如20250xGame week2出现的颜文字编码

实际上,这样的广义编码类型很多,我们需要开拓思维,识别其中的重复性内容,并恰当使用搜索引擎即可解出flag


关于解码

编码的逆过程被称为“解码”(Decode or Decrypt)

解码的方式参考base64的编码过程,逆向进行即可,这里不再赘述

需要注意的是:编码的过程是完全可逆的。不同于密码,编码的规则公开,且都是一一对应的关系,当我们知道编码信息和初始信息中的其一时,另一个的内容也已经明确。

原因呢,在于它和密码的目的不同:编码只是为了方便信息的传输,而密码是为了隐藏和保护信息。

一般地,我们在题目中只需要识别出编码类型,对于具体的解码,使用解码工具即可

当然也可以随波逐流,cyberchef或者ai一把梭


结语

本文中涉及的仅仅是常见编码,更多的内容还需读者自行探索

如果对文中的内容有疑问,欢迎找博主交流(,,・ω・,,)

评论

  1. Tangent0712
    2 月前
    2025-11-18 22:15:37

    喵喵喵

  2. 神秘人
    1 月前
    2025-12-04 19:28:36

    喵喵喵

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇