攻防世界-MISC-picture3

"本文探讨了一种通过zip伪加密和Base64隐写技术的解码过程,作者分享了如何识别加密标志、利用zip头的伪加密特性,并揭示了隐藏在Base64编码中的实际信息。最终,通过脚本实现了解密并揭示flag{Ba5e_64OFive}
摘要由CSDN通过智能技术生成

        下载附件发现是jpg文件,扔到010Editor查看文件16进制,ctrl+f查找pk、rar等值在文件尾发现zip文件格式,(也可以放入kail,直接binwalk提取)

将其提取后发现是经过加密的zip文件

去找提取密码,但是没有思路

于是回到zip文件的十六进制,可以发现是zip伪加密

个人概要:
50 4B 03 04 作为zip头文件标记,它的后面第三、四位为全局方式位标记(用来判断有无加密),而
50 4B 01 02 作为目录中文件文件头标记,它的后面第五、六位为全局方式位标记(更改该位置可以进行伪加密,如改为01 00就会提示有密码)

 

将该区域改为00后,就可以直接打开txt文件

 CTF——MISC——zip伪加密总结  

(里面挺详细的)

打开txt后发现文件内容经过base64加密,但是直接解密的东西不是我们想要的

 

拓展想到base64隐写。MISC | base64隐写(大佬对base64隐写的总结)

(本来想写自己对base64隐写的了解,但是了解的不到位,写不出来,就请大家去看看上面链接的内容吧,里面挺到位的)


脚本

import re
import base64

b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

# stego.txt为待解密的base64隐写字符串所在的文件
f = open('stego.txt','r')
base64str = f.readline()

# pattern2用于匹配两个等号情况时,等号前的一个字符
# pattern2用于匹配一个等号情况时,等号前的一个字符
pattern2 = r'(\S)==$'
pattern1 = r'(\S)=$'

# 提取后的隐写二进制字符加入binstring中
binstring = ''

# 逐行读取待解密的base64隐写字符串,逐行处理
while(base64str):
    # 先匹配两个等号的情况,如果匹配不上,再配置一个等号的情况
    # 如果无等号,则没有隐藏,无需处理
    if re.compile(pattern2).findall(base64str):
        # mstr为等号前的一个字符,该字符为隐写二进制信息所在的字符
        mstr = re.compile(pattern2).findall(base64str)[0]
        # 确认mstr字符对应的base64二进制数,赋值给mbin
        mbin = bin(b64chars.find(mstr))
        # mbin格式如0b100,mbin[0:2]为0b
        # mbin[2:].zfill(6)为将0b后面的二进制数前面补0,使0b后面的长度为6
        mbin2 = mbin[0:2] + mbin[2:].zfill(6)
        # 两个等号情况隐写了4位二进制数,所以提取mbin2的后4bit
        # 赋值给stegobin,这就是隐藏的二进制信息
        stegobin = mbin2[-4:]
        binstring += stegobin
    elif re.compile(pattern1).findall(base64str):
        mstr = re.compile(pattern1).findall(base64str)[0]
        mbin = bin(b64chars.find(mstr))
        mbin2 = mbin[0:2] + mbin[2:].zfill(6)
        # 一个等号情况隐写了2位二进制数,所以提取mbin2的后2bit
        stegobin = mbin2[-2:]
        binstring += stegobin
    base64str = f.readline()

# stegobin将各行隐藏的二进制字符拼接在一起
# 从第0位开始,8bit、8bit处理,所以range的步进为8
for i in range(0,len(binstring),8):
    # int(xxx,2),将二进制字符串转换为10进制的整数,再用chr()转为字符
    print(chr(int(binstring[i:i+8],2)),end='')

 

 最后跑出答案为flag{Ba5e_64OFive}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值