zoukankan      html  css  js  c++  java
  • 攻防世界-misc-base64stego

    得到一个加密的压缩包

    百度了一下,简单了解zip文件的结构:
    zip文件由三部分构成:压缩源文件数据区+目录区+目录结束区
    源文件数据区:文件头+文件数据+数据描述符

    通过百度我们知道这个zip文件是一个伪加密
    需要使用winhex工具去修改文件头的加密标志位,或者使用zipcenop.jar
    下面说说两种工具的简单使用:

    • winhex
      可参考https://blog.csdn.net/pdsu161530247/article/details/73612910
      大致操作如下截图:

      为什么要搜索50 4B呢,因为50 4B 01 02是目录中文件文件头标记,关于更多详细信息参考上面给出的帖子

    • zipcenop.jar
      或者使用zipcenop.jar(需要java环境)进行破解:

    java -jar ZipCenOp.jar r a2eb7ceaf5ab49f7acb33de2e7eed74a.zip
    

    得到一个base64加密的文本:
    行数有点多,此处就不放该文本了

    解密后得到如下内容:
    Steganography is the art and science of writing hidden messages in such a way that no one
    没有flag
    这里涉及到一个base64的隐写
    我们可以利用base64的隐写py脚本跑出结果:

    Base_sixty_four_point_five
    

    由于本人也没有学过python,此处关于脚本的编写我也是直接copy的别人的脚本:

    import re
    import base64
    
    b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    
    # s.txt为待解密的base64隐写字符串所在的文件
    f = open('s.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='')
    print()
    

    可参考:
    https://www.jianshu.com/p/1e4308489865
    https://www.tr0y.wang/2017/06/14/Base64steg/

    作者:
    除特别声明为原创博文外,均可转载,也欢迎转载,未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利,谢谢您的配合。
  • 相关阅读:
    多线程编程1-定义理解与三种实现方式
    Java类集框架详细汇总-底层分析
    Trie、并查集、堆、Hash表学习过程以及遇到的问题
    spring前导知识-Tomcat、Maven等配置
    双指针、位运算、离散化、区间合并的手动模拟
    单点登录原理与简单实现
    Spring引入外部配置文件
    Java异常机制
    Java多线程-线程的概念和创建
    java webservice服务器端获取request对象的三种方式
  • 原文地址:https://www.cnblogs.com/sillage/p/14494131.html
Copyright © 2011-2022 走看看