记一次hackbar乱码密文中文解码

27 篇文章 25 订阅
本文记录了一次解决CTF挑战中的base64编码中文密文解密过程。通过分析和实验,揭示了base64编码与解码的原理,以及在解码过程中可能出现的乱码问题,特别是涉及到UTF-8和GBK编码的转换。最后,探讨了hackbar插件在解码时可能出现的ASCII解码错误,并总结了解码乱码问题的原因。
摘要由CSDN通过智能技术生成

记一次hackbar乱码密文中文解码

问题背景提及:

是这样的,我朋友在做ctfshow的终极考核时突然问我glhf!ctshow有什么脑洞类的解密方法。
.
.
由于这短短的11个字符的”密文“我实在是想不出和flag有什么关联,因为这些字符和flag关键字的ASCII顺序相差实在太大了,所以也不是什么凯撒密码的变种,可能是我脑子里没有洞了,实在想不出来。
.
.
于是进一步询问下朋友给我发了一串密文,说看看能不能获取到什么信息:

5oGt5Zac5biI5YKF5p2l5Yiw56ys5LqM5YWz77yBCgrnrKzkuozlhbPnm7jmr5TnrKzkuIDlhbPvvIzkvp3ml6fmmK/msqHmnInpmr7luqbjgIIKCmdsaGYhCgogICAgICAgICAgICAgICBjdHNob3cg5aSn6I+c6bih

.
.
这个密文第一眼看过去判定是base64解密,于是用firefoxhackbar插件直接解密一下发现的确有glhf!ctshow字眼,其他的都是乱码:
在这里插入图片描述
.
.
由于我判定glhf!ctshow根本提供不了什么有价值的东西,所以我决定从密文入手,逐个尝试了Vigenere密码凯撒密码替代密码、以及用ciphey智能分析脚本分析,都没有什么收获:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我问朋友他想要得到什么信息,比如先要什么关键字之类的,朋友说不知道。。。。而且还继续强调了glhf!ctshowflag字眼的特殊关联,于是线索又回到可识别的glhf!ctshow上了:
在这里插入图片描述
.
.
于是我索性用pythonb64.decode直接脚本解码密文,看看和firefox的有没有什么不同:

import base64
s="5oGt5Zac5biI5YKF5p2l5Yiw56ys5LqM5YWz77yBCgrnrKzkuozlhbPnm7jmr5TnrKzkuIDlhbPvvIzkvp3ml6fmmK/msqHmnInpmr7luqbjgIIKCmdsaGYhCgogICAgICAgICAgICAgICBjdHNob3cg5aSn6I+c6bih"
print(base64.b64decode(s))

在这里插入图片描述
.
.
结果好像没差,但是这些\xe6之类的16进制编码强烈引起了我的注意,因为好巧不巧我刚好在研究python的一些编码问题!!!
这些\x??的不是gbk就是utf-8编码,因为unicode是固定的\u????两字节形式的。

先试试gbk解码:

import base64
s="5oGt5Zac5biI5YKF5p2l5Yiw56ys5LqM5YWz77yBCgrnrKzkuozlhbPnm7jmr5TnrKzkuIDlhbPvvIzkvp3ml6fmmK/msqHmnInpmr7luqbjgIIKCmdsaGYhCgogICAgICAgICAgICAgICBjdHNob3cg5aSn6I+c6bih"
#print(base64.b64decode(s))
d=b'\xe6\x81\xad\xe5\x96\x9c\xe5\xb8\x88\xe5\x82\x85\xe6\x9d\xa5\xe5\x88\xb0\xe7\xac\xac\xe4\xba\x8c\xe5\x85\xb3\xef\xbc\x81\n\n\xe7\xac\xac\xe4\xba\x8c\xe5\x85\xb3\xe7\x9b\xb8\xe6\xaf\x94\xe7\xac\xac\xe4\xb8\x80\xe5\x85\xb3\xef\xbc\x8c\xe4\xbe\x9d\xe6\x97\xa7\xe6\x98\xaf\xe6\xb2\xa1\xe6\x9c\x89\xe9\x9a\xbe\xe5\xba\xa6\xe3\x80\x82\n\nglhf!\n\n               ctshow \xe5\xa4\xa7\xe8\x8f\x9c\xe9\xb8\xa1'
print(d.decode('gbk'))

在这里插入图片描述

再试试utf8解码:

import base64
s="5oGt5Zac5biI5YKF5p2l5Yiw56ys5LqM5YWz77yBCgrnrKzkuozlhbPnm7jmr5TnrKzkuIDlhbPvvIzkvp3ml6fmmK/msqHmnInpmr7luqbjgIIKCmdsaGYhCgogICAgICAgICAgICAgICBjdHNob3cg5aSn6I+c6bih"
#print(base64.b64decode(s))
d=b'\xe6\x81\xad\xe5\x96\x9c\xe5\xb8\x88\xe5\x82\x85\xe6\x9d\xa5\xe5\x88\xb0\xe7\xac\xac\xe4\xba\x8c\xe5\x85\xb3\xef\xbc\x81\n\n\xe7\xac\xac\xe4\xba\x8c\xe5\x85\xb3\xe7\x9b\xb8\xe6\xaf\x94\xe7\xac\xac\xe4\xb8\x80\xe5\x85\xb3\xef\xbc\x8c\xe4\xbe\x9d\xe6\x97\xa7\xe6\x98\xaf\xe6\xb2\xa1\xe6\x9c\x89\xe9\x9a\xbe\xe5\xba\xa6\xe3\x80\x82\n\nglhf!\n\n               ctshow \xe5\xa4\xa7\xe8\x8f\x9c\xe9\xb8\xa1'
print(d.decode('utf8'))

在这里插入图片描述
.
.
成功解出信息,虽然是描述,但对于我来说终究是解出来了,不过对朋友来说可能就没有什么用了(^ ~ ^):
在这里插入图片描述
.
.

深入分析乱码问题:

虽然解出来了,但是我们继续深入探讨一下,我想知道它怎么编码出一开始看到的5oGt5Z~的密文的。然后为什么hackbar插件又出现乱码,hackbar是用什么编码解码的。
.
.

第一个问题:怎么编码出一开始看到的5oGt5Z~的密文?

这时我们要有前置知识,b前缀只能加在ASCII字符上面,bytes()函数则可以将任意字符串编码为比特流。附上我以前整理的笔记:

可以通过字符串来创建 bytes 对象,或者说将字符串转换成 bytes 对象。有以下三种方法可以达到这个目的:
1:如果字符串的内容都是 ASCII 字符,那么直接在字符串前面添加 b前缀 就可以转换,或者更确切的说是声明为 bytes 类型,因为所有扩展编码都可以处理 ASCII 字符。(默认为utf8编码)

2:如果字符串的内容有 非ASCII 字符,比如中文之类的,可以用 bytes() 函数。
bytes 是一个类,调用它的构造方法,也就是 bytes(),可以将任意字符串按照指定的字符集转换成 bytes;但是必须用encoding指定字符集,如:bytes('中国',encoding='utf-8')

3:字符串本身有一个 encode() 和 decode() 方法,该方法专门用来将字符串按照指定的字符集转换成对应的字节串;如果不指定字符集,那么默认采用 UTF-8。

   #通过构造函数创建空 bytes
    b1 = bytes()
  
  #通过空字符串创建空 bytes,注意里面只能写ASCII字符
    b2 = b''

   #尝试用 b 前缀输出非ASCII字符,报错SyntaxError: bytes can only contain ASCII literal characters.
    print(b'中国')
  
  #通过b前缀将字符串转换成 bytes,这些都是ASCII字符,所以可以声明
    b3 = b'http://c.biancheng.net/python/'
 
   #为 bytes() 方法指定字符集,这里有中文,所以不能直接用 b 前缀
    b4 = bytes('中国', encoding='UTF-8')		#注意一定要指定encoding编码,没有默认编码
 
   #通过 encode() 方法将字符串转换成 bytes
    b5 = "中国".encode('UTF-8')

    #通过 decode() 方法将 bytes 转换成字符串
    str1 = b5.decode('UTF-8')

    #b前缀和bytes()函数的互通,下面输出结果是一样的,b前缀默认是utf8编码
     d=b'abcde'
     print(d)
     print(bytes(d.decode('utf8'),encoding='utf8'))

.
.
这时我们可以做一个简单的实验:

import base64
print(base64.b64encode(bytes('中国',encoding='utf8')))
print(bytes('中国',encoding='utf8'))

在这里插入图片描述

然后我们拿着这串5Lit5Zu9hackbar上解码看看:
在这里插入图片描述

到此第一个5oGt5Z~的密文是怎么编码出来的问题好像是解决了,它就是用bytes('中文字符',encoding='utf8')直接扔入base64编码出密文的。

我们做以下实验,第一个根据 b前缀 声明的比特流输出解码后的中文,第二个根据bytes和b前缀的呼唤输出同样的编码,第三个根据d.decode('utf8')的中文用utf8编码后扔入base64中加密

import base64
d=b'\xe6\x81\xad\xe5\x96\x9c\xe5\xb8\x88\xe5\x82\x85\xe6\x9d\xa5\xe5\x88\xb0\xe7\xac\xac\xe4\xba\x8c\xe5\x85\xb3\xef\xbc\x81\n\n\xe7\xac\xac\xe4\xba\x8c\xe5\x85\xb3\xe7\x9b\xb8\xe6\xaf\x94\xe7\xac\xac\xe4\xb8\x80\xe5\x85\xb3\xef\xbc\x8c\xe4\xbe\x9d\xe6\x97\xa7\xe6\x98\xaf\xe6\xb2\xa1\xe6\x9c\x89\xe9\x9a\xbe\xe5\xba\xa6\xe3\x80\x82\n\nglhf!\n\n               ctshow \xe5\xa4\xa7\xe8\x8f\x9c\xe9\xb8\xa1'
print(d.decode('utf8'))
print(bytes(d.decode('utf8'),encoding='utf8'))
print(base64.b64encode(bytes(d.decode('utf8'),encoding='utf8')))

在这里插入图片描述
.
.
.
.

第二个问题:hackbar是用什么编码解码的

OKK,第一个问题彻底解决了,开始看第二个问题为什么hackbar插件又出现乱码,hackbar是用什么编码解码的。这次我们用上次的简单例子就好啦(^ ~ ^):

import base64
print(base64.b64encode(bytes('中国',encoding='utf8')))
print(bytes('中国',encoding='utf8'))

在这里插入图片描述
在这里插入图片描述

这个 ä 我猜想是ASCII码值,也就是hackbar应该是直接把\xe4\xb8\xad\xe5\x9b\xbd作为ASCII字符解码了,做一个简单的实验:

print(ord('ä'))
print(hex(ord('ä')))
print(ord('A'))
print(hex(ord('A')))

在这里插入图片描述
.
.
.

总结:

中文通过 utf8 编码后生成的 \x?? 比特流可以进行 base64 编码 -------> 正常来讲 base64 解码后出现的是中文的 utf8 编码值,也就是 \x?? ----------> 但是 hackbar 在进行 base64 解码时对出现的 \x?? 一类的字符会进行解码,关键就是是进行 ASCII 字符的解码 ---------> 用 ASCII 解 UTF8 编码就是乱码出现的根本。
.
.
.

后记:

额。。。。。后来朋友说ctfshow本来就是中文显示的,它发给我就是想让我看看glhf!ctshow有什么脑洞类的解密方法。之所以base64加密后发给我是因为怕信息丢失。。。。。换句话说就是我瞎分析。。。。。。。。。。
在这里插入图片描述
算了,就这样吧。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐一 · 林

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

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

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

打赏作者

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

抵扣说明:

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

余额充值