CTF-Misc--处理压缩包大量文件将其转为二进制->10进制->字符串 脚本

在这里插入图片描述

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)
  • 先提取压缩包内的所有文件名和文件大小
  • 因为zipobj.namelist()文件列表中的文件名不是按递增排序的,所以需要先将文件名和文件大小提取到另一个列表内
  • 第一条数据是空的需要删除
  • 这个大列表内存在着许多的小列表,每个子列表代表一个文件,子列表的第一个元素是文件名称,第二个元素是文件大小
  • 因为文件名称是以out/名称为格式的,所以需要删除后缀和out/字符串,保留数字后再转换成数字类型
  • 使用sorted()函数对大列表进行递增,如果列表的元素都为列表时,默认会按每个子列表的第一个元素递增排序
  • 之后的操作就是将文件大小替换成0和1,每8位二进制就转换成十进制,然后再从十进制转换成ASCII码对应的字符
  • 最后把字符结果写入文件

Guess you like

Origin blog.csdn.net/weixin_45556441/article/details/119895066