如何解释这两个未压缩的zlib样本?

时间:2018-10-02 22:59:41

标签: python reverse-engineering zlib specifications

我正在尝试学习如何阅读规格。让我们看看尝试压缩后得到的内容:1)一个空缓冲区和2)感叹号:

>>> zlib.compress(b'', 0)
b'x\x01\x01\x00\x00\xff\xff\x00\x00\x00\x01'
>>> zlib.compress(b'!', 0)
b'x\x01\x01\x01\x00\xfe\xff!\x00"\x00"'

到目前为止,我发现x\x01是一种神奇的格式,告诉我们正在查看一个未压缩的zlib示例。然后是\x01我无法解释(我想这意味着“未压缩的块跟随”)和\x01\x00似乎是缓冲区长度,之后是\xfe\xff(这似乎是如果我增加更多字节,则进一步减少),然后数据和四个字节似乎就是Adler校验和。

现在,我的问题是:如何找到第三个字节和接下来的四个字节是什么意思?

还有一种方法可以跳过Adler校验和,并且仍然产生zlib.decompress()可以处理的内容吗?换句话说,是否有较短的最小Zlib缓冲区样本?

1 个答案:

答案 0 :(得分:2)

zlib包装器的格式可以在RFC 1950中找到,其包装的deflate压缩数据的格式可以在RFC 1951中找到。

x\x01是zlib标头,末尾的\x00\x00\x00\x01是Adler-32校验。中间是一个存储的放气块,由\x01标识,它是一个三位报头,从最低有效位(即1)开始,指示这是流中的最后一个放气块,并且接下来的两位为零,表示已存储的块。其余五个位是填充位,用于将流带到字节边界。然后\x00\x00\xff\xff是存储的块内容的两字节长度(0),后跟长度的一个补码作为错误检查。空存储块就是这样。

对于带有感叹号的存储块,不同之处在于长度为1(请注意,长度为小尾数顺序),其后是补码,然后是感叹号本身。 Adler-32检查值与带有一个字节的消息对应,该字节为感叹号。

您可以使用zlib.compressobj等于wbits的{​​{1}}来请求没有zlib包装的原始deflate流。