完成第一题的基本步骤后,得到一串奇怪的编码:
48454354467b796f755f6172655f676f6f647d
为了得到答案,需要进行解密
首先,观察一下这串字符,发现由数字和小写英文字母组成。
【我解题时使用的是base16解码,而官方wp给出的是Hex解码】
经试验,两种解码方式均可得到flag
如图:
那么为什么呢?
我们先来看看其他人给的定义:【ps:我做题的时候搜到的,当时因为这个点感到很困惑】
Base16编码就是将ASCII字符集中可打印的字符(数字0-9,字母A-F)对应的二进制字节数据进行编码的方式
1.将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数,不足8比特位高位补0.然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数.
2.根据十进制数值找到Base16编码表里面对应的字符.Base16是4个比特位表示一个字符,所以原始是1个字节(8个比特位)刚好可以分成两组,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符.数据量是原先的2倍.
【附上原文链接:https://blog.csdn.net/lili13897741554/article/details/82177472(引用的他人解释,但是觉得不太对??【为什么没有小写字母呢?毕竟本文中就是解码出了小写字母】)】->事实证明并不靠谱
Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后输出这两个字节对应十六进制数字作为编码。Hex编码后的长度是源数据的2倍
很好,不太能理解,现在让我们找一些例子:
1、base16
由前面的定义来看,base16编码貌似只适用于数字0-9,字母A-F。
先试验一下:
将字母:
HECTF编码 得到4845435446
则H->48 E->45 C->43 T->54 F->46
没有问题
那么根据本题的语境,让我们来试一下‘{’ 和 ‘}’能否使用base16编码叭
{ 编码得到7B,} 编码得到7D
从这里可以看出,base16也可以将 { 和 }编码
以 { 为例:{ 对应ASCII码值为123,转换为二进制即为:0111 1011,以四比特分为两部分,第一部分对照值为7,第二部分为12,经过base16编码便为7B【但同时,这里发现 { 的十六进制数也为7B】
再试一下大小写字母的区别吧:
B编码得到42,b编码得到62
从这里,我们又能发现小写字母也是可以进行base16编码的
但是得到的flag中含good,其中o的范围也超出了原本base16的定义,我们再来试一试:
o编码得到6F
看来超出规定范围的字母也可以被编码
分析到这里,我们可以发现我搜到的定义好像不太靠谱,因为就我们得到的结论来看,Base16可以对上文中的定义范围外的字符编码。反而,我们分析得到的结论和过程可以发现,base16编码得到的字符的范围和定义中的相符:数字0-9,字母A-F。
于是,另一个新的问题产生了:我们本次题目的flag解码前,是由数字和小写字母组成的,
试一下用base16编码一下我们的flag: HECTF{you_are_good}
得到
48454354467B796F755F6172655F676F6F647D20
可以清晰的发现,由base16编码的flag得到的值也全都是大写。
那么为什么我依旧可以得到结果呢?可以试验一下使用base16来解码7B796F755F6172655F676F6F647D20
得到{you_are_good}再试一下小写7b796f755f6172655f676f6f647d,
得到{you_are_good}
2、hex
这下就很好理解hex编码解码了,我们来试验几组就行啦!
解码7B796F755F6172655F676F6F647D20
得到{you_are_good}
解码48454354467b796f755f6172655f676f6f647d
得到HECTF{you_are_good}
这种情况看起来和base16很类似呀
那么它们有什么关系嘞:
Base16(hexadecimal)是一种16进制数字系统,使用16个不同的符号来表示数字0-15.这16种符号通常是数字0-9字母A-F(或a-f)
而Hex解码是将Base16编码转换回二进制数据的过程
【实际上,我会产生这些疑惑的原因是我对这些编码方式完全不了解,希望以后能多学习一下,在有一定了解的基础下,分析被加密的字符也会更得心应手叭】