CTF入门之常见的编码(持续更新中ing)

[X] 🛰:ly3260344435
[X] 🐧:3260344435
[X] BiliBili:鱼影安全
[X] 公众号:鱼影安全
[X] CSDN:落寞的魚丶
[X] 知识星球:中职-高职-CTF竞赛
[X] 信息安全评估(高职)、中职网络安全、金砖比赛、世界技能大赛省选拔选拔赛、电子取证比赛培训等
欢迎师傅们交流学习,加我可以拉粉丝群~

ASCII编码:

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)编码(简称ASCII码)是基于拉丁字母的一套计算机编码方案,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,等同于国际标准ISO/IEC 646。在计算机中,所有数据都要使用二进制数表示。字母、数字以及一些常用符号(*、#、@等)也要通过二进制数表示,不同的二进制数表示不同的符号。为了约定字符(符号)和二进制数之间的对应关系(也就是编码),美国的标准化组织制定了ASCII码,规定了常用符号用哪些二进制数来表示。

ASCII码的最初构想是用7位(也称为比特,bit)表示一个字符(符号),因此一共可以表示128(0~127)个字符。在后来的使用过程中,人们倾向于用一个字节表示一个字符,一个字节是8位,所以将ASCII码扩展为8位,扩展后的ASCII码可以表示256个字符。标准ASCII码也称为基础ASCII码,使用7位二进制数(剩下的1位二进制数为0)来表示所有大写和小写字母、数字、标点符号,以及在美式英语中使用的特殊控制字符。

ASCII特点:

在CTF比赛中,主要考查控制字符(不可打印字符)和可打印字符的范围。控制字符(不可打印字符)的范围是0~31127,十六进制对应的范围是0x00~0x1F和0x7F;可打印字符的范围是32~126,十六进制对应的范围是0x00~0x7E。
在CTF比赛中遇到可打印字符范围内的字节时,要考虑到将其转化为对应字符。ASCII码的解码方法是:在Koczkatamas工具包中,根据进制把要转换的字符串复制到DEC、HEX或者OCT行,在第一行(ASCII)即可看到对应的字符。

两个字符“66”表示一个字节,查ASCII表可知0x66对应字母f

Base64编码:

Base64编码是一种将二进制数据转换为ASCII字符的编码方式,它起源于1960年代的美国军方通信系统,如今已成为网络通信领域的标准编码方法。
Base64原理:
Base64编码将二进制数据按8位一组进行划分,对每一组二进制数据进行转换,得到一个由ASCII字符组成的字符串。

  1. 编码规则:Base64编码采用固定的编码表,将二进制数据映射为ASCII字符。编码表中包含24个字符,包括数字、大写字母和小写字母。
PS:经过上述步骤,字符串“fla”被编码为“Zmxh”。(这个结果要求背诵并默写!)

特征就是 ==结尾可能是Base64 编码

举例:

Hello word !
SGVsbG8gd29yZA==

Base32编码与Base64编码类似,它使用32个可见字符表示所有数据。其编码原理是把原始数据按每5字节分为一组将每组的5个8比特数据切分为8个5比特数据,然后根据Base32编码的标准索引表将5比特数据转换为对应的字符。填充仍然用“=”表示。Base32编码的标准索引表

Base16编码:

Base16编码使用16个可见字符表示所有数据。其编码原理是把原始数据每个字节分为一组,将每组的8比特数据切分为2个4比特数据,然后根据Base16标准索引表(如表1.1.4所示)将4比特数据转换为对应的字符,即每个字节可以转换为2个字符表示。

其他Base系列编码:
所有Base编码产生的原因都是想把不可打印字符转换为可打印字符,区别在于转换时的方法和索引表略有不同。接下来将简单介绍Base58、Base62和Base85的编码原理,这些编码都可以在CyberChef工具包中实现解码。

Base58编码:

Base58是一种独特的编码方式。其编码原理是:Base58的标准索引表中去掉了容易产生歧义的字符,如0(零)和O(大写字母O)、I(大写的字母I)和l(小写的字母L),以及影响双击选择的字符,如/和+。所以,Base58的标准索引表中正好有58个字符(包括9个数字、24个大写字母、25个小写字母),又因为58不是2的整次幂,因此没有采用Base64编码中的方法进行转换,而是采用辗转相除法实现原始数据和索引表中地址的转换,本质是转换为五十八进制。

Base62编码:

假设我们现在是一位网页开发者,开发需求是在URL中传输数据,需要把不可打印字符转换为可打印字符再传输。我们马上想到采用Base64编码,但是Base64标准索引表中的“+”和“/”在URL地址中有特殊的含义(在URL中,“+”表示空格,“/”表示分隔目录和子目录)。此时有两种解决方案:①替换“+”和“/”,例如,对于commons-codec中的Base64.encodeBase64URLSafeString(),用“-”和“_”分别替换“+”和“/”;②采用一种新的编码传输,也就是Base62编码。目前,各社交网站的短URL地址基本上都采用这种编码。其编码原理是:Base62的标准索引表有62个字符,顺序为:数字0~9、大写字母A~Z、小写字母a~z,这种编码也是采用辗转相除法实现原始数据和索引表地址的转换,其本质是转为六十二进制。

Base85编码:

Base85是在Base64的基础上进一步压缩数据。Base85主要应用在PDF文档以及Git使用的二进制文件的补丁中。其编码原理为:用5个字符来表示4个字节。Base85还可以细分为标准型、ZeroMQ(Z85)和RFC1924三种。
(1)标准型
标准型也被称为Standard或者ASCII85,其索引表的字符集为ASCII码的“!”到“u”,共85个字符,用“z”表示0x00000000,“y”表示0x20202020。下面给出一个例子。

(2)ZeroMQ(Z85)
Z85是现有的ASCII85编码机制的一个派生版本,具有更好的可用性,特别适合在源代码中使用(https://rfc.zeromq.org/spec/32/)。其索引表如下:

(3)RFC1924
RFC1924是针对IPv6地址的一种编码方式。原始IPv6地址需要32字节表示,经过这种方式编码,仅用20字节就可以表示一个IPv6地址(https://tools.ietf.org/html/rfc1924)。其索引表如下:

这三种格式都可以在开头和结尾添加“<~”和“~>”符号,并且在CyberChef工具包中可以手动选择不同格式后再进行解码。
PS:这里就介绍这么多比赛的时候一般Bse64 32 这种比较常见 不确定就使用CyberChef依次尝试!

Shellcode编码(不常用,了解即可):

Shellcode是一段利用软件漏洞而执行的代码,本质是十六进制的机器码,因攻击者可以通过其获得系统shell而得名。针对字符串,也可以采用Shellcode编码,其格式是在每个字符ASCII码的十六进制表示前加“\x”。

Shellcode编码后的字符串特征是每个字节前面都有“\x”。Shellcode编码的解码方法和Base16编码完全相同,在Koczkatamas工具包中直接把字符串复制到HEX行,不必删除“\x”,即可在第一行(ASCII)看到解码后的内容。下面看一个例子。
编码前:I love you Jack
编码后:\x49\x20\x6c\x6f\x76\x65\x20\x79\x6f\x75\x20\x4a\x61\x63\x6b

UUencode编码:

UUencode是“UNIX-to-UNIX encoding”的简称,是在UNIX系统下将二进制数据通过UUCP邮件系统传输的一种编码方式,常用于电子邮件中的档案传送以及Usenet新闻组和BBS的帖文,等等。近年来已逐渐被MIME取代。
UUencode的编码原理为:将输入数据按每3字节为一个单位进行编码,如果最后剩下的数据少于3字节,则用零补齐到3字节。3字节共有24比特,以6比特为单位分为4个组,每组数值在十进制下的范围是0~63,将每个数加上32,产生的结果刚好落在ASCII字符集中可打印字符(32~95)的范围内。输出时,每60个字符为独立的一行,每行的开头会加上长度字符。除了最后一行之外,长度字符都应该是“M”(32+45=77),最后一行的长度字符为32+剩下的字节数目对应的ASCII字符。如果一个6比特组转换后为0,那么会被转换为0x60而不是0x20。
下面给出一个例子。
编码前:
hello wrod!
编码后:
.:&5L;&@=V]R9"#OO($`

在线解密:http://web.chacuo.net/charsetuuencode

Xencode编码:

XXencode的编码原理和Base64完全相同,只是转换时的索引表不同,可以看作变形的Base64。
XXencode的索引表:

XXencode编码输出时的格式和UUencode相似,每60个字符为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是“h”(索引表中第45位),最后一行的长度字符为字节数在索引表中位置所代表字符。编码时默认填充比特0,填充的字符和具体的工具有关
在线XXencode解码网站http://web.chacuo.net/charsetxxencode用索引表的第一个字符作为填充。

hello word !
AO4JgP4wURqxmN0+V

URL编码:

URL编码也称为百分号编码。URL地址规定,常用数字、字母可以直接使用,特殊用户字符(/,:@等)也可以直接使用,剩下的字符必须通过%xx编码处理。其编码方法很简单,就是在每个字节ASCII码的十六进制字符前面加“%”,如字符空格编码后的结果是%20。具体解码方法为:在Koczkatamas工具包中直接把字符串复制到URL行,即可在第一行(ASCII)看到解码后的内容。
这个很简单 特征就是 % 举个例子

hellow word!
hello%20word%20%A3

摩斯码密码:

摩斯码一般是指莫尔斯电码,也称作摩斯密码,它是由美国人萨缪尔·莫尔斯在1837年发明的。摩斯码是由点()和划(-)这两种符号组成的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。其中,点作为一个基本的信号单位,划的长度相当于3个点的时间长度;在一个字母或数字之内,每个点、划之间的间隔应该是两个点的时间长度;字母(数字)与字母(数字)之间的间隔是7个点的时间长度。摩斯码主要由以下5种代码组成:
❑点(.)。
❑划(-)。
❑每个字符间短的停顿(通常用空格表示停顿)。
❑每个词之间中等的停顿(通常用“/”划分)。
❑句子之间长的停顿。

举例子:
在线解密:https://www.bejson.com/enc/morse/

JSFuck编码:

JSFuck是一种人类难以阅读的基于JavaScript的编程语言,代码中仅使用“[”“]”“(”“)”“!”和“+”六种字符。理论上,JSFuck的运行不需要依赖浏览器,它也可以在Node.JS上运行。
具体的转换原理可以参考官方网站http://www.jsfuck.com。
注意,JSFuck代码和JavaScript代码不是一一对应的关系。一般而言,规范书写的JavaScript代码都能转换成JSFuck代码,但JSFuck代码不一定都能转换成JavaScript代码。在CTF比赛中,JSFuck常用于JavaScript的加密,需要选手运行JSFuck代码或者手工解密,读懂代码内部逻辑。
JSFuck的运行方法如下:打开浏览器,按键打开调试界面,选择控制台(Console)选项卡,复制代码,按回车键即可显示运行结果。如果浏览器运行报错,可以检查字符串是否复制完整或者换用QQ、360等浏览器。

hello word !

+!+[]]+(!+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])

Brainfuck编码:

Brainfuck是一种极小化的程序语言,本质上它并不属于编码。它是由Urban Muller于1993年创造的,发明Brainfuck是为了创建一种简单的、可以用最小的编译器来实现的、符合图灵完备思想的编程语言。这也导致Brainfuck代码对非专业人员基本不可读。该语言只有八种符号,所有操作都由这八种符号的组合来完成

Brainfuck在线工具https://www.splitbrain.org/services/ook 实现编码和解码

hello word !
+++++ +++++ [->++ +++++ +++<] >++++ .---. +++++ ++..+ ++.<+ +++++ ++[->
----- ---<] >---- ----- ----- -.<++ +++++ ++[-> +++++ ++++< ]>+++ +++.-
----- --.++ +.<++ +[->- --<]> ----- .<+++ +++++ [->-- ----- -<]>- ---.<
+++++ +++++ ++++[ ->+++ +++++ +++++ +<]>+ +++++ +++++ .<+++ ++++[ ->---
----< ]>--. <++++ +++[- >---- ---<] >---- ----- -.<

ok编码:

如果输出结果较为规范,则应该是5个字符为一组,每组以空格分隔,代码开头部分有若干加号,这些可以作为识别Brainfuck代码的明显特征。Brainfuck代码还有变形,分别是Ook!和Short Ook!代码。

Ook!是一种由David Morgan-Mar创建的编程语言,它与Brainfuck完全相同,只是指令被改成了其他表示形式。Ook!只包含3种符号:Ook.,Ook!和Ook?(这个特征比较简单)

https://www.splitbrain.org/services/ook中选择Ook! To Text,得到结果Ook。

知识点:
为了缩短书写时间和避免多次编码,有时会通过删除Ook简化代码,使其成为三元代码,即只有3种符号—— 点(.)、问号(?)和感叹号(!) 这样就可以组合成Ook了

Ook!编码与Brainfuck编码的对应关系:

在这里插入图片描述

Short Ook!与Brainfuck的对应关系
在这里插入图片描述

PDU编码:

PDU(Protocol Data Unit)‌是一种用于短信传输的编码方式,它能够将文本、多媒体消息等数据封装成适合在移动通信网络中传输的格式。PDU编码支持多种短信类型,包括文本短信、彩信、闪信等,并且可以处理中文短信。

在线解密:http://www.sendsms.cn/pdu/

持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落寞的魚丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值