因此我从路由器上备份了zte zxv10h201l和基于linux的备份,但无法识别此文件的压缩类型。
这是它的第一个“行”

00000000  99 99 99 99 44 44 44 44  55 55 55 55 aa aa aa aa  |....DDDDUUUU....|
00000010  00 00 00 00 00 00 00 00  00 00 00 04 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 40  |...............@|
00000040  00 01 00 00 00 00 00 80  00 00 23 90 00 00 00 00  |..........#.....|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  04 03 02 01 00 00 00 00  00 00 00 0b 5a 58 56 31  |............ZXV1|
00000090  30 20 48 32 30 31 4c 01  02 03 04 00 00 00 00 00  |0 H201L.........|
000000a0  01 4c 54 00 00 23 78 00  00 20 00 40 34 b7 80 e9  |.LT..#x.. .@4...|
000000b0  80 47 c0 00 00 00 00 00  00 00 00 00 00 00 00 00  |.G..............|
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000d0  00 00 00 00 00 20 00 00  00 03 d0 00 00 04 18 78  |..... .........x|
000000e0  da ed 58 61 53 da 30 18  fe be 5f c1 f1 03 b0 29  |..XaS.0..._....)|
000000f0  88 db 4e 77 07 6d d1 de  00 3b e8 64 b7 2f 5e 6c  |..Nw.m...;.d./^l|
00000100  23 e6 2c 49 2f 4d 11 f6  eb 97 da 56 0b da 34 45  |#.,I/M.....V..4E|
00000110  77 d3 13 94 2b 94 27 6f  9e be 79 f2 bc 6f 7b 6c  |w...+.'o..y..o{l|
00000120  f6 bf 7d 6a 88 d7 b1 7b  15 34 08 5c a0 93 a6 d9  |..}j...{.4.\....|
00000130  ef c3 08 35 1b 13 7a 67  d0 98 f0 93 26 68 a6 a0  |...5..zg....&h..|
00000140  7b a0 38 dd 18 d3 93 a6  56 38 79 ff 83 39 ca 02  |{.8.....V8y..9..|
00000150  d8 03 9b 5c d3 66 63 09  03 01 03 e2 4f 17 ef 8e  |...\.fc.....O...|
00000160  96 be 80 d6 d5 40 27 fd  a6 03 fd 30 3b 7d 98 fc  |.....@'....0;}..|
00000170  92 1e f5 ec d8 4e 8e cd  83 c2 dc 07 62 f2 8c ef  |.....N......b...|
我将ttl-rs232连接到路由器,然后在路由器Web UI上按了备份按钮时,该消息显示在日志中。

=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2014.01.31 22:58:29 =~=~=~=~=~=~=~=~=~=~=~=
04:15:12 [webd][Info] [upload.c(1138)my_upload_file] Enter my_upload_file.
04:15:12 [webd][Info] [upload.c(1343)my_upload_file] Begin download file.(filetype : config)
04:15:12 [DB][Info] [dbc_mgr_file.c(1644)dbGetBinFile] DB get cfg start
04:15:12 [FLASHRW][Info] [proc_file_mod.c(1204)file_open] open file: /proc/cfg/db_user_cfg.xml
04:15:12 [FLASHRW][Info] [proc_file_mod.c(1334)file_close] close file: /proc/cfg/db_user_cfg.xml
04:15:12 [DB][Info] [dbc_mgr_file_en(570)dbcCfgFileIsEnc] FileIsEncry return 0
04:15:12 [FLASHRW][Info] [proc_file_mod.c(1204)file_open] open file: /proc/cfg/db_user_cfg.xml
04:15:12 [FLASHRW][Info] [proc_file_mod.c(1334)file_close] close file: /proc/cfg/db_user_cfg.xml
04:15:12 [DB][Info] [dbc_mgr_file_si(198)dbcCfgFileSign] SignFile return 0
04:15:12 [DB][Info] [dbc_mgr_file_ve(277)dbcCfgFileVersi] add FileVersion return 0
04:15:12 [DB][Warn] [dbc_mgr_file.c(1708)dbGetBinFile] DB download cfg(iRet:0)
04:15:12 [webd][Info] [upload.c(644)create_config_f] user cfg path:/var/tmp/version-cfg

,所以我在路由器固件中搜索了像上面的文本,并找到了这行/>
deflate 1.1.4 jean loup gailly

在一些字符串附近,在快速Google搜寻后,它接缝到说这是zlib,它用于压缩“东西”,之后用我的知识我试图用这样的命令来解压缩

printf“ \ x1f \ x8b \ x08 \ x00 \ x00 \ x00 \ x00 \ x00” | cat-zlib.raw | gzip -dc
猫/ tmp / data | openssl zlib -d

,但是没有运气,后来我在网络上发现了类似的文件,但没有压缩,所以我看一下,它接缝了文件头和另外两个“ byts”与我的压缩文件相同,我不确定我如何跳过这些第一个“字节”并尝试解压缩其余的“数据”,同样从日志u可以看到某种类型的“符号”,也需要跳过,此处未压缩的类似文件的外观如何

00000000  99 99 99 99 44 44 44 44  55 55 55 55 aa aa aa aa  |....DDDDUUUU....|
00000010  00 00 00 00 00 00 00 00  00 00 00 04 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 40  |...............@|
00000040  00 02 00 00 00 00 00 80  00 04 5e 85 00 00 00 00  |..........^.....|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  3c 44 42 3e 0a 3c 54 62  6c 20 6e 61 6d 65 3d 22  |<DB>.<Tbl name="|
00000090  44 42 42 61 73 65 22 20  52 6f 77 43 6f 75 6e 74  |DBBase" RowCount|
000000a0  3d 22 31 22 3e 0a 3c 52  6f 77 20 4e 6f 3d 22 30  |="1">.<Row No="0|
000000b0  22 3e 0a 3c 44 4d 20 6e  61 6d 65 3d 22 49 46 49  |">.<DM name="IFI|
000000c0  6e 66 6f 22 20 76 61 6c  3d 22 30 31 30 31 30 32  |nfo" val="010102|
000000d0  30 31 30 34 30 30 30 30  30 30 30 31 30 36 30 31  |0104000000010601|
000000e0  30 34 30 30 30 30 30 32  31 32 35 30 30 30 30 30  |0400000212500000|
000000f0  30 30 35 30 30 31 30 30  30 30 35 30 30 32 30 30  |0050010000500200|
00000100  30 30 35 30 30 33 30 30  30 30 22 2f 3e 0a 3c 2f  |0050030000"/>.</|
00000110  52 6f 77 3e 0a 3c 2f 54  62 6c 3e 0a 3c 54 62 6c  |Row>.</Tbl>.<Tbl|
00000120  20 6e 61 6d 65 3d 22 45  54 48 22 20 52 6f 77 43  | name="ETH" RowC|
00000130  6f 75 6e 74 3d 22 34 22  3e 0a 3c 52 6f 77 20 4e  |ount="4">.<Row N|
00000140  6f 3d 22 30 22 3e 0a 3c  44 4d 20 6e 61 6d 65 3d  |o="0">.<DM name=|
00000150  22 56 69 65 77 4e 61 6d  65 22 20 76 61 6c 3d 22  |"ViewName" val="|
00000160  49 47 44 2e 4c 44 31 2e  45 54 48 31 22 2f 3e 0a  |IGD.LD1.ETH1"/>.|
00000170  3c 44 4d 20 6e 61 6d 65  3d 22 4c 44 57 44 56 69  |<DM name="LDWDVi|

在这里您可以找到压缩的备份。
编辑:在图片上,您可以看到两个文件db_user_cfg.xml(来自日志的文件)的比较(左侧)和“相同文件”,但何时在右侧“备份”


评论

如何在我的zxhn h298a路由器config.bin文件中输入我自己的mac地址并还原到它?

#1 楼

如果查看备份文件的偏移量0xDF,则会看到两个字节:


0x78 0xDA一个zlib压缩文件。

实际上,原始XML配置文件已被拆分为多个zlib压缩块:

$ binwalk default-config.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------------------
223           0xDF            Zlib header, best compression, uncompressed size >= 8192
1211          0x4BB           Zlib header, best compression, uncompressed size >= 8192
2260          0x8D4           Zlib header, best compression, uncompressed size >= 8192
2901          0xB55           Zlib header, best compression, uncompressed size >= 8192
3796          0xED4           Zlib header, best compression, uncompressed size >= 8192
4306          0x10D2          Zlib header, best compression, uncompressed size >= 8192
5224          0x1468          Zlib header, best compression, uncompressed size >= 8192
6066          0x17B2          Zlib header, best compression, uncompressed size >= 8192
7084          0x1BAC          Zlib header, best compression, uncompressed size >= 8192
8058          0x1F7A          Zlib header, best compression, uncompressed size >= 8192
8981          0x2315          Zlib header, best compression, uncompressed size >= 3156


如果对每个块进行解压缩并将解压缩的数据连接在一起,您将获得原始的XML配置文件。

评论


谢谢你devttys0非常高兴你在这里,我为你刚才所说的感到惊讶,我在这个文件上运行了biwalk,但是没有从他那里得到任何东西,很奇怪:) $ binwalk Binwalk v1.2.2-1再次感谢你的时间和欢呼!

– Vido
2014年2月2日在18:25



zlib扫描在v1.2.2中作为可选插件实现。现在,最新代码(github.com/devttys0/binwalk)的默认扫描中包含zlib。

–devttys0
2014年2月2日20:00

太好了,我必须拥有那个新版本:)

– Vido
2014年2月2日在21:58

#2 楼

好吧,这里是可以工作的小python脚本:)


import zlib

magic_numbers = ['\x78\xDA']
filename = 'config-marina.bin'

infile = open(filename, 'r')
data = infile.read()

pos = 0
found = False

while pos < len(data):
    window = data[pos:pos+2]
    for marker in magic_numbers:
        if window == marker:
            found = True
            start = pos
            print "Start of zlib %s" % pos
            rest_of_data = data[start:]
            decomp_obj = zlib.decompressobj()
            uncompressed_msg = decomp_obj.decompress(rest_of_data)
            print "Content: %s" % uncompressed_msg
            break
    if pos == len(data):
        break
    pos += 1

if found:
    header = data[:start]
    footer = decomp_obj.unused_data

if not found:
    print "Sorry, no zlib found."


评论


为了使其适用于我在计算机上找到的Python 2.7.7,我必须更改以下行:infile = open(filename,'r')To:infile = open(filename,'rb')

–阿蒂拉·科瓦奇(AttilaKovács)
2014-09-29 19:11



该脚本还适用于最新的ZTE F609 ONT固件(v5)。谢谢!

– EDP
16年1月21日在17:19

@Vido一些白痴拿了您的解压缩脚本,并在exploit-db.com上声称它利用了零日漏洞

– julian♦
17年3月3日在1:31

Tnx报告@SYS_V ...大声笑:)

– Vido
17 Mar 3 '17 at 16:10

#3 楼

config.bin文件中的每个压缩块都以一个小的3-DWORDs头作为前缀,该头包含以下信息:


未压缩的xml块的长度。对于除最后一个块以外的所有块,此值均为0x10000。最后一个块的该值为0x0。

这些标头可用于避免在检测块期间出现误报:有效块将在第一个字段上使用0x10000或在第三个字段上使用0x0领域。标头还可以用于验证未压缩的数据大小。

import re
import zlib
import struct


def extract_config_xml(config_bin):
    config_xml = b''
    for zlib_chunk in re.finditer('\x78\xda', config_bin):
        zlib_chunk_start = zlib_chunk.start()
        zlib_chunk_header = config_bin[zlib_chunk_start - 12: zlib_chunk_start]
        xml_chunk_length, zlib_chunk_length, config_bin_length = \
            struct.unpack('>LLL', zlib_chunk_header)
        if xml_chunk_length == 0x10000 or config_bin_length == 0:
            zlib_chunk_end = zlib_chunk_start + zlib_chunk_length
            zlib_chunk = config_bin[zlib_chunk_start: zlib_chunk_end]
            xml_chunk = zlib.decompress(zlib_chunk)
            assert xml_chunk_length == len(xml_chunk)
            config_xml += xml_chunk
    return config_xml


with open('config.bin', 'rb') as f:
    print extract_config_xml(f.read())


评论


感谢您的很好的解释,对我来说,这很清楚发生了什么:)

– Vido
15年6月30日在6:41