CTF之编码技术(一)
常见编码
1.ASCII编码
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
ASCII编码大致可以分作三部分组成:
第一部分是:ASCII非打印控制字符(参详ASCII码表中0-31);
第二部分是:ASCII打印字符,也就是CTF中常用到的转换;
第三部分是:扩展ASCII打印字符(第一第三部分详见ASCII码表解释)。

2.base64/32
特征:字符串末尾有一个或两个等号
BASE64是一种编码方式, 是一种可逆的编码方式.
编码后的数据是一个字符串, 包含的字符为: A-Za-z0-9+/
共64个字符:26 + 26 + 10 + 1 + 1 = 64
其实是65个字符, “=”是填充字符.
64个字符需要6位二进制来表示, 表示成数值为0~63.

这样, 长度为3个字节的数据经过Base64编码后就变为4个字节
编码
比如, 字符串”Tr0”经过Base64编码后变为”VHIw”

上面说的字符串长度为3个字节的数据位数是8x3=24, 可以精确地分成6x4.
如果字节数不是3的倍数, 则位数就不是6的倍数, 那么就不能精确地划分成6位的块.
此时, 需在原数据二进制值后面添加零, 使其字节数是3的倍数.
然后, 在编码后的字符串后面添加1个或2个等号”=”, 表示所添加的零值字节数.
比如, 字符串”Tr0y”经过Base64编码后变为”VHIweQ==”

橙色底纹就是添加的0.
这是Base64编码的方式.
解码
解码就是编码的逆过程.
- 把Base64字符串去掉等号, 转为二进制数(VHIweQ== -> VHIweQ -> 010101000111001000110000011110010000).
- 从左到右, 8个位一组, 多余位的扔掉, 转为对应的ASCII码(01010100 01110010 00110000 01111001 0000 -> 扔掉最后4位 -> 01010100 01110010 00110000 01111001 -> Tr0y)
隐写原理
注意红色的0, 我们在解码的时候将其丢弃了, 所以这里的值不会影响解码. 所以我们可以在这进行隐写.
为什么等号的那部分0不能用于隐写? 因为修改那里的二进制值会导致等号数量变化, 解码的第1步会受影响. 自然也就破坏了源字符串.
而红色部分的0是作为最后一个字符二进制的组成部分, 还原时只用到了最后一个字符二进制的前部分, 后面的部分就不会影响还原.
唯一的影响就是最后一个字符会变化. 如下图

如果你直接解密’VHIweQ==’与’VHIweR==’, 得到的结果都是’Tr0y’.
当然, 一行base64顶多能有2个等号, 也就是有2*2位的可隐写位. 所以我们得弄很多行, 才能隐藏一个字符串, 这也是为什么题目给了一大段base64的原因.
接下来, 把要隐藏的flag转为8位二进制, 塞进去就行了.。
base32/16
base64就是用6位,2的6次幂就是64,所以就是Base64。同理Base32就是5位,16就是4位。

浙公网安备 33010602011771号