开头
以下内容针对windows
系统!!!
在CVE-2022-25099之后记这篇文章有讲到怎么还原,当时提到了两种还原思路,一种是将解码后的乱码复制到一个txt文件中,然后修改后缀名为zip
,但是当时这种思路有问题。现在复盘一下。
失败原因
待系统学习windows和linux系统的文件格式和各种类型文件的文件编码。
虽说不具体了解,但是知道不同格式的文件有其独特的文件头、文件尾标识以及文件编码方式,比如图片文件、视频文件等。
比如在制作图片马
时,需要将图片和木马转换为二进制然后将木马二进制追加到图片二进制之后。
为什么不将图片用文本编辑器打开然后保存为txt
文件,再将木马添加到txt
文件末尾后再修改后缀名为jpg
呢?这种方式制作图片马还能否正常打开显示图像呢?
带着疑问我尝试以这种方式制作图片马,具体步骤如下:
制作好后,发现无法正常显示。原因如下:
如上文所述,不同格式的文件有其独特的文件头、文件尾标识以及文件编码方式。在第二步另存为txt
文件时,添加了txt
文件独有的标识,改变了二进制。所以再将其改为jpg
文件,系统也无法按图片的解析方式正常解析图像。
当然以修改后缀名的方式还原zip
文件也是因此原因失败。
新想法,用文本编辑器打开图片后,直接在末尾添加字符串再保存,图片会不会正常显示图像
带着想法尝试,步骤如下:
经过测试,发现图片正常显示图像。
同时又诞生新想法,直接修改 jpg 文件后缀名为 txt 。然后用画图软件打开
经测试发现,画图软件打开后图像正常显示。
小小总结
直接修改文件名并不会修改文件的文件格式,也就是不会修改文件的二进制。
仅仅改变了系统对文件的标识,换句话就是仅仅改变了文件名而已(windows系统文件名由名称和后缀名组成)
回归话题,怎么还原base64编码的zip文件
windows系统可以使用命令certutil
还原,步骤如下:
base64
字符串保存到一个 txt 文件中,例如 base64.txtcertutil -decode base64.txt source.zip
使用我编写的python工具还原:
# -*- coding: utf-8 -*-
import argparse
import base64
import zipfile
def main():
parser = argparse.ArgumentParser(description='This is a simple base64 encoded zip file restoration tool')
parser.add_argument('-f', '--file', type=str, required=True)
args = parser.parse_args()
restoration(args)
def restoration(args):
# 经过Base64编码的ZIP文件数据
base64_encoded_data = open(args.file, 'r').read()
# 解码Base64数据
decoded_data = base64.b64decode(base64_encoded_data)
# 写入解码后的数据到ZIP文件
with open("restored_file.zip", "wb") as file:
file.write(decoded_data)
print("ZIP文件已还原")
# 如果需要提取ZIP中的文件内容,可以使用zipfile模块
with zipfile.ZipFile("restored_file.zip", 'r') as zip_ref:
# 提取所有文件到目标文件夹
zip_ref.extractall("restore_folder")
print("ZIP文件已解压缩")
if __name__ == '__main__':
main()
将代码保存为baseToZip.py
,然后使用命令:
python baseToZip.py -f base64.txt
使用命令后,会出现restored_file.zip
文件和restore_folder
目录
restored_file.zip是还原后的zip文件,restore_folder是restored_file.zip解压后的目录。
注意关闭 Windows Defender 安全杀毒软件 的实时保护,因为会识别木马文件,所以解压的木马文件也会打不开