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

    首先下载附件,得到一个压缩包,发现有密码。

    这个时候先用winhex打开。

    首先要了解伪加密。

    0x00:ZIP伪加密

    一个ZIP文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。
    伪加密原理:zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包。

     一般来说,文件各个区域开头就是50 4B,然后后面两个字节是版本,再后面两个就是判断是否有加密的关键了。

    比如这题:

    压缩源文件数据区:


    50 4B 03 04:这是头文件标记(0x04034b50)
    14 03:解压文件所需 pkware 版本
    00 00:全局方式位标记(判断有无加密的重要标志)
    08 00:压缩方式
    68 BF:最后修改文件时间
    9B 48:最后修改文件日期
    FE 32 7D 4B:CRC-32校验
    E9 0D 00 00:压缩后尺寸
    B5 1B 00 00:未压缩尺寸
    09 00:文件名长度
    00 00:扩展记录长度



    压缩源文件目录区:

    50 4B 01 02:目录中文件文件头标记(0x02014b50)
    3F 03:压缩使用的 pkware 版本
    14 03:解压文件所需 pkware 版本
    00 00:全局方式位标记(有无加密的重要标志,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)
    08 00:压缩方式
    68 BF:最后修改文件时间
    9B 48:最后修改文件日期
    FE 32 7D 4B:CRC-32校验(1480B516)
    E9 0D 00 00:压缩后尺寸(25)
    B5 1B 00 00:未压缩尺寸(23)
    09 00:文件名长度
    24 00:扩展字段长度
    00 00:文件注释长度
    00 00:磁盘开始号
    00 00:内部文件属性
    20 80 ED 81:外部文件属性
    00 00 00 00:局部头部偏移量

    压缩源文件目录结束标志:

    50 4B 05 06:目录结束标记
    00 00:当前磁盘编号
    00 00:目录区开始磁盘编号
    01 00:本磁盘上纪录总数
    01 00:目录区中纪录总数
    5B 00 00 00:目录区尺寸大小
    10 0E 00 00:目录区对第一张磁盘的偏移量
    00 00:ZIP 文件注释长度

    然后就是识别真假加密
    1.无加密
    压缩源文件数据区的全局加密应当为00 00
    且压缩源文件目录区的全局方式位标记应当为00 00
    2.假加密
    压缩源文件数据区的全局加密应当为00 00
    且压缩源文件目录区的全局方式位标记应当为09 00
    3.真加密
    压缩源文件数据区的全局加密应当为09 00
    且压缩源文件目录区的全局方式位标记应当为09 00

    然后这题全局为00 00 但是在结尾发现是09 00,所以为假加密,把09 00 改成00 00就能解压打开文件了。

    得到如下文件:

     txt下面很多符号,结合题目是base64,但是这么长一串base64肯定有问题,然后看大佬们base64隐写解密脚本,运行得到答案。

    解密脚本:

    import base64
    b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    with open('stego.txt', 'rb') as f:
        bin_str = ''
        for line in f.readlines():
            stegb64 = str(line, "utf-8").strip("
    ")
            rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("
    ")
            offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) - b64chars.index(rowb64.replace('=', '')[-1]))
            equalnum = stegb64.count('=')  # no equalnum no offset
            if equalnum:
                bin_str += bin(offset)[2:].zfill(equalnum * 2)
            print(''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)]))  # 8 位一组

    还有个加密脚本:

    # -*- coding: cp936 -*-
    import base64
    flag = 'Tr0y{Base64isF4n}'  # flag
    bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag])
    base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1:  # '0.txt'是明文, '1.txt'用于存放隐写后的 base64
        for line in f0.readlines():
            rowstr = base64.b64encode(line.replace('
    ', ''))
            equalnum = rowstr.count('=')
            if equalnum and len(bin_str):
                offset = int('0b' + bin_str[:equalnum * 2], 2)
                char = rowstr[len(rowstr) - equalnum - 1]
                rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset])
                bin_str = bin_str[equalnum * 2:]
            f1.write(rowstr + '
    ')

    总结:

    参考博客:

    伪加密:https://blog.csdn.net/weixin_41687289/article/details/82695801

    base64隐写:https://www.tr0y.wang/2017/06/14/Base64steg/

  • 相关阅读:
    SpringMVC访问静态资源
    tomcat 在linux下的关闭问题
    Mysql中MyISAM、InnoDB两种表类型的区别
    大数据——数据库优化
    for循环 java.lang.OutOfMemoryError: Java heap space
    Tomcat内存溢出的三种情况及解决办法分析
    浅谈eclipse生成的.classpath文件(转)
    深入理解java异常处理机制
    漫步ASP.NET MVC的处理管线
    用 javascript 获取当页面上鼠标(光标)位置
  • 原文地址:https://www.cnblogs.com/wushengyang/p/12436393.html
Copyright © 2011-2022 走看看