Misc-----[2021祥云杯初赛]鸣雏恋 提取压缩包文件图片名8个为一组 转ASC码base64转图片

在这里插入图片描述
在这里插入图片描述
得到一个.docx文件

目前大部分的.docx文档都是 以压缩的形式存在的

修改末尾为zip 查看

在这一步中 我之前直接把这个鸣雏恋.docx给foremost 分离了,分离后的压缩包打开后没找到 love.zip
key.txt ε=(´ο`*)))唉

.
在这里插入图片描述
在这里插入图片描述这里是领宽度字符隐写
在这里插入图片描述vim key.txt 打开查看即可
在这里插入图片描述http://330k.github.io/misc_tools/unicode_steganography.html

在这里插入图片描述压缩包密码是:Because I like naruto best

接着我们来打开 love.zip 压缩包
在这里插入图片描述

分析可得:

有129488张图片,图片只有两种类型,分别用,0 1 来表示 8个为一组,转为10进制后 转为字母即可

算法的大致思路如下:

  • 先提取压缩包内的所有文件名和文件大小.

  • 因为zipobj.namelist()文件列表中的文件名不是按递增排序的,所以需要先将文件名和文件大小提取到另一个列表内

  • 第一条数据是空的需要删除

  • 这个大列表内存在着许多的小列表,每个子列表代表一个文件,子列表的第一个元素是文件名称,第二个元素是文件大小

  • 因为文件名称是以out/名称为格式的,所以需要删除后缀和out/字符串,保留数字后再转换成数字类型

  • 使用sorted()函数对大列表进行递增,如果列表的元素都为列表时,默认会按每个子列表的第一个元素递增排序

  • 之后的操作就是将文件大小替换成0和1,每8位二进制就转换成十进制,然后再从十进制转换成ASCII码对应的字符

  • 最后把字符结果写入文件

# 小作者:小狐狸FM
import zipfile
lis = []
result = ""
data = ""
size = 1
with zipfile.ZipFile('love.zip', 'r') as zipobj: #读取压缩包
    for file_name in zipobj.namelist(): #遍历名称
        info = zipobj.getinfo(file_name)
        file_name = file_name.encode('cp437').decode('gbk')
        lis.append([file_name,info.file_size])
# print(lis)
del lis[0]
for i in range(len(lis)): #处理文件名和数据
    lis[i][0] = lis[i][0].replace("out/","")
    lis[i][0] = lis[i][0].replace(".png", "")
    lis[i][0] = int(lis[i][0])
    if lis[i][1]==262:
        lis[i][1]='0'
    else:
        lis[i][1]='1'
# print(lis)
lis = sorted(lis)
# print(lis)
for i in range(len(lis)):
    data += lis[i][1] #数据大小
    if len(data)%8==0: #集齐八位二进制时
        result+=chr(int(data,2))
        data=""
with open("2.txt","w") as fp:
    fp.write(result)

在这里插入图片描述

base64转图片

http://tool.chinaz.com/tools/imgtobase/

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

Guess you like

Origin blog.csdn.net/weixin_45556441/article/details/119889281
Recommended