使用binwalk简单雕刻zip文件

逆向工程 二元分析 文件格式
2021-06-21 07:47:58

到目前为止,我一直试图在一个非常大的转储文件上使用 binwalk,但没有取得太大的成功。每次我尝试使用它时,它都会生成非常大的 zip 文件来填充磁盘,直到我遇到磁盘已满错误(使用 Linux)。

我试图了解我做错了什么,所以这里有一个简单的场景,希望能理解我做错了什么。

脚步:

$ dd if=/dev/zero of=head bs=1 count=512
$ dd if=/dev/zero of=tail bs=1 count=512
$ wget https://github.com/devttys0/binwalk/archive/master.zip
$ cat head binwalk-master.zip tail > full
$ binwalk -z -C demo -D 'zip archive:zip:unzip %e' full

有人可以让我知道为什么我看到以下内容:

$ find demo
demo
demo/_full.extracted
demo/_full.extracted/483BD.zip
demo/_full.extracted/200.zip

这个文件来自哪里?有什么理由保留它吗?

$ unzip -l demo/_full.extracted/483BD.zip 
Archive:  demo/_full.extracted/483BD.zip
5be61ad220a42e7b2c7e912024fda5edd84b4843
error [demo/_full.extracted/483BD.zip]:  missing 295357 bytes in zipfile
  (attempting to process anyway)
error [demo/_full.extracted/483BD.zip]:  attempt to seek before beginning of zipfile
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)

额外问题:有没有办法真正只提取 zip 文件(删除tail内容):

$ crc32 binwalk-master.zip demo/_full.extracted/200.zip 
8ce4d36c    binwalk-master.zip
81923fef    demo/_full.extracted/200.zip
$ ls -al binwalk-master.zip demo/_full.extracted/200.zip 
-rw-r--r-- 1 user user 295419 Sep 29 08:54 binwalk-master.zip
-rw-r--r-- 1 user user 295931 Sep 29 09:02 demo/_full.extracted/200.zip
1个回答

Binwalk 产生多个大文件,因为 zlib 头不包含任何关于压缩数据大小的信息。

应执行以下步骤来提取 zip 文件:

  • 识别标题(在0x200和 处找到0x483BD
  • 将 zip 文件保存到文件中。但是,因为头文件中没有关于大小的任何信息,所以应该使用最坏的情况,并且应该写出整个剩余文件。

因为标头标识不可能是完美的并且可能出现误报,所以您不能假设第二个标头意味着第一个 zip 的结尾。

如果你想解压没有tail的zip文件,你可以执行以下操作:

  • 反转二进制文件的结构。通常,每个图像部分都以具有精确尺寸信息的标题开头。您必须在其中标识标题和大小或偏移值。
  • 如果您使用 Flash 图像,那么您可以执行熵分析,这有助于将整个图像分成更小的部分。
  • 在闪存映像中,各个部分通常用几个0xFF字节相互隔开您还可以使用此信息来提取图像部分。