【问题标题】:How to use magic bytes to identify files using python如何使用魔术字节来识别使用 python 的文件
【发布时间】:2019-08-30 09:52:10
【问题描述】:

我遇到了一个问题:

我们提取了一个外星 zip 文件,它是一堆 PNG 文件,但我们认为其中只有一个是有效的。使用魔术字节来确定它是哪个。 提示:查找并读取正确的文件以获取标志。

所有 png 文件都存储在 /tmp 目录中。在对这个问题进行了几次尝试之后,我才到此为止。我的代码运行良好,但为每个文件打印no,根据我的代码,它们都不是正确的。

到目前为止,这是我的代码:

import glob,os

magic_numbers = {'.png': bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])}
max_read_size = max(len(m) for m in magic_numbers.values()) # get max size of magic numbers of the dict
os.chdir("/tmp")
for x in glob.glob("*.png"):
    with open(x, 'rb') as fd:
            file_head = fd.read(max_read_size)

    if file_head.startswith(magic_numbers['.png']):
            print("It's a PNG File")
    else:
            print("no")

显然我做错了什么,但我无法弄清楚它是什么。是不是循环有问题?我应该如何使用魔术字节来识别文件?

【问题讨论】:

  • 你的代码对我有用。我创建了一个 tmp 文件夹,其中包含许多 png 文件,以及我创建的一个文本文件(我将其重命名为 .png),并且您的代码正确识别了所有文件。 (我使用的是 python 3.7)
  • 嘿伙计,这对你来说可能已经太晚了......但问题不在于你在这里使用的逻辑。你期望这个问题比它更复杂。只需转储标题并查看它们。
  • 这是作业题吗?
  • @jtlz2 不,这不是别担心

标签: python file byte


【解决方案1】:

您的代码需要进行一些调整,通过在单词 png 前加上一个点,您可以让文件看起来好像有扩展名。另外,打印file_head。运行这个:

import glob, os

magic_numbers = {'png': bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])}
max_read_size = max(len(m) for m in magic_numbers.values()) # get max size of magic numbers of the dict
os.chdir("/tmp")

for x in glob.glob("*png"):
    with open(x, 'rb') as fd:
        file_head = fd.read()
        print(file_head)

    if file_head.startswith(magic_numbers['png']):
        print("It's a PNG File")
    else:
        print("no")

它应该打印如下内容:

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\nIDATx\x9cc\x00\x01\x00\x00\x05\x00\x01\r\n-\xb4\x00\x00\x00\x00IEND\xaeB`\x82The flag is: 2NECGNQM4GD3QPD' It's a PNG File

你的旗帜可能与我的不同。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多