DLink LIF 固件:从文件读取块 1191378964 时出错。(成功)

逆向工程 固件 安全
2021-06-24 17:05:25

我正在尝试使用 LIF 图像查看一些 D-link 调制解调器固件的内部。我得到:

v@debian:~/lifutils# src/progs/lifstat /home/v/Downloads/DSL-25
Volume : �SI 
Tracks: 0 Surfaces: 0 Blocks per Track: 0.
Warning the medium was not initialized properly!
Directory start : 1191378964 (37230592/1/5) end : 1191395347 (37231104/1/4)
Error reading block 1191378964 from file. (Success)
v@debian:~/lifutils# 

你将如何扭转这种局面?调制解调器希望使用 Web 界面上传文件,所以我假设需要指定一些偏移量?但是调制解调器不允许我偷看。

Dlink-固件 LIF-utils

1个回答
  • 包含固件映像的 D-Link 二进制文件中没有 LIF 文件。 file返回一个误报。由于不存在 LIF 文件,lifutils包中的工具将失败或产生错误结果
  • 不要暗中信任工具。如果工具依赖于幻数、特定字节序列等,它们可能会返回误报。在分析新的、未知的或不熟悉的文件时,尤其是不符合已知标准的文件时,请使用手动技术验证工具的结果,例如分析 hexdump 和二进制结构的可视化

我们可以高度自信地声称,即使不分析文件,HP-UX LIF 文件也不会出现在 D-Link 二进制文件中。

HP 和逻辑交换格式

从 LIF 开始:

lif手册页

LIF(逻辑交换格式)是一种 Hewlett-Packard 标准大容量存储格式,可用于在各种 HP 计算机系统之间交换文件。LIF 卷包含一个标头(将其标识为 LIF 卷)和一个定义该卷内容(即文件)的目录。初始化卷时,目录的大小是固定的(请参阅 lifinit(1)),并设置可以在卷上创建的文件数的上限。HP-UX 包含一组实用程序(称为 lif*(1)),可用于:

  • 初始化一个 LIF 卷(即创建一个标题和一个空目录),
  • 将文件复制到 LIF 卷或从 LIF 卷复制文件,
  • 列出 LIF 卷的内容,
  • 删除 LIF 文件,
  • 重命名 LIF 文件。

lif*(1) 实用程序是 HP-UX 中唯一已知 LIF 卷内部结构的实用程序。对于 HP-UX 的其余部分,LIF 卷只是一个包含一些未指定数据的文件。绝不能将术语 LIF 卷与 HP-UX 文件系统卷或可安装卷的概念混淆。

来自 HP 论坛的更多信息:了解引导程序和 LIF 区域....

LIF 文件旨在用于 HP-UX 系统。

现在到 HP-UX:

来自维基百科:

HP-UX(来自“Hewlett Packard Unix”)是 Hewlett Packard Enterprise 专有的 Unix 操作系统实现,基于 UNIX System V(最初是 System III)并于 1984 年首次发布。最近的版本支持 HP 9000 系列计算机系统,基于 PA-RISC 处理器架构的 HP Integrity 系统,基于 Intel 的 Itanium 架构。

HP-UX 是专有的(与开源相反)并在具有称为 PA-RISC 的独特指令集架构的系统上运行。

有了这些知识,我们可以得出结论,除非

  1. D-Link 与惠普达成某种协议,允许 D-Link 使用惠普专有的硬件和软件
  2. D-Link 设备使用 HP 处理器和 HP-UX

LIF 文件实际上不能存在于 D-Link 固件中。

如何去反转文件

在统计学中有一种称为探索性数据分析的方法,其中使用各种技术探索数据,以便在正式​​分析之前深入了解数据。在二进制分析和逆向中可以采用类似的方法,其中在动态技术之前采用静态技术。

这是一个很好的参考:逆向工程固件:Linksys WAG120N

1.file可以使用,但不要指望它会有帮助

一般来说,file在分析包含固件映像的二进制文件时基本上没用,因为这些二进制文件中通常嵌入了许多不同的文件,例如 HTML 文档、GIF 和 JPEG 文件等图像文件、压缩文件系统、引导加载程序,当然还有固件本身。这些不符合任何标准,它们的结构和内容因设备和制造商而异,因此没有魔术字节或标准头或签名。有时file比无用更糟糕,因为它返回误报。

2.stringshexdump

二进制文件中可能嵌入了有用的字符串,例如有趣文件的路径名、函数名称、错误消息等。如果运行没有产生人类可读的 ASCII 序列strings,则强烈表明二进制文件以某种方式编码(压缩、混淆、加密)。hexdump提供了一种快速确定二进制文件中是否存在可辨别的标头结构的方法。

3. 使用固件分析工具扫描二进制文件,例如 binwalk

binwalk除了要扫描的文件名之外不带任何参数使用将导致binwalk在二进制文件中搜索各种签名,这些签名指示压缩区域的开始,以及其他信息,例如其他文件的存在。binwalk针对问题中链接的固件映像运行会产生相当多的有用输出:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
44468         0xADB4          ZyXEL rom-0 configuration block, name: "dbgarea", compressed size: 0, uncompressed size: 0, data offset from start of block: 16
44504         0xADD8          ZyXEL rom-0 configuration block, name: "dbgarea", compressed size: 0, uncompressed size: 0, data offset from start of block: 16
85043         0x14C33         LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 66696 bytes
118036        0x1CD14         Unix path: /usr/share/tabset/vt100:\
118804        0x1D014         ZyXEL rom-0 configuration block, name: "spt.dat", compressed size: 0, uncompressed size: 0, data offset from start of block: 16
118824        0x1D028         ZyXEL rom-0 configuration block, name: "autoexec.net", compressed size: 25972, uncompressed size: 11886, data offset from start of block: 16
128002        0x1F402         GIF image data, version "89a", 125 x 25
136194        0x21402         GIF image data, version "87a", 153 x 55
173900        0x2A74C         Copyright string: "Copyright © 2007 D-Link System, Inc."
188042        0x2DE8A         Copyright string: "Copyright © 2007 D-Link System, Inc."
213304        0x34138         Copyright string: "Copyright © 2007 D-Link System, Inc."
350259        0x55833         LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 2659840 bytes

4. 使用其他技术确认扫描结果

  1. 手动分析使用 hexdump

filebinwalk搜索特定的字节序列,这意味着它也可能产生误报。在扫描的输出中,发现了 2 个 LZMA 压缩签名,一个位于 offset 0x14C33,另一个位于 offset 0x55833如果紧跟在压缩签名之后的区域在结构上与压缩签名之前的区域不同并且看起来是随机的,则表明它不是误报。但是,需要额外的验证。

的输出hexdump -C -s 0x14900(压缩签名是在0x14C33):

00014900  74 20 20 31 20 20 20 20  20 00 43 77 6d 70 41 74  |t  1     .CwmpAt|
00014910  74 72 32 20 20 20 20 20  20 31 00 52 65 73 65 72  |tr2      1.Reser|
00014920  76 65 5f 33 20 20 20 20  20 20 20 31 00 52 65 73  |ve_3       1.Res|
00014930  65 72 76 65 5f 34 09 09  09 09 31 00 53 65 72 76  |erve_4....1.Serv|
00014940  65 72 56 36 09 09 09 09  31 00 53 65 72 76 65 72  |erV6....1.Server|
00014950  56 36 5f 65 78 74 09 09  31 00 41 63 63 65 73 73  |V6_ext..1.Access|
00014960  53 65 63 48 6f 73 74 56  36 09 31 00 41 63 63 65  |SecHostV6.1.Acce|
00014970  73 73 53 65 63 48 6f 73  74 56 36 5f 65 78 74 09  |ssSecHostV6_ext.|
00014980  31 00 52 65 73 65 72 76  65 5f 35 09 09 09 09 31  |1.Reserve_5....1|
00014990  00 50 43 50 09 09 09 09  09 09 31 00 42 77 43 74  |.PCP......1.BwCt|
000149a0  72 6c 52 75 6c 65 09 09  31 36 00 00 00 00 00 00  |rlRule..16......|
000149b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00014c00  00 00 00 00 00 00 53 49  47 04 00 01 04 88 00 00  |......SIG.......|
00014c10  41 cf e0 00 cb 32 d5 a5  48 54 50 5f 54 43 20 56  |A....2..HTP_TC V|
00014c20  20 30 2e 30 35 00 00 00  00 00 00 00 00 00 00 00  | 0.05...........|
00014c30  00 00 00 5d 00 00 80 00  88 04 01 00 00 00 00 00  |...]............|
00014c40  00 1e 02 1a 10 f9 e9 ec  c2 6e a7 ff e6 17 33 0d  |.........n....3.|
00014c50  5c ae 0c 00 3f 33 0b dd  d4 9a 4d 26 de e8 35 ed  |\...?3....M&..5.|
00014c60  8a dc 50 d0 60 18 b3 a3  6d 95 ff 45 c1 7f 15 94  |..P.`...m..E....|
00014c70  d0 12 90 ae ec 09 a6 1d  75 6e 41 b3 b6 43 24 6d  |........unA..C$m|
00014c80  55 cb bd 11 32 f9 54 f1  96 d5 9f f1 21 d1 39 b6  |U...2.T.....!.9.|
00014c90  d3 44 2d 74 9d 5d ff fc  3c 7f 53 84 86 03 df 84  |.D-t.]..<.S.....|
00014ca0  2c 5b 25 94 c2 60 f4 66  01 c1 62 9d 05 af 43 34  |,[%..`.f..b...C4|
00014cb0  9e 57 6c 8b e8 41 24 80  48 c5 5a 56 27 1a 1c c3  |.Wl..A$.H.ZV'...|

首先,我们观察到有一系列 ASCII 字符串后跟一个空区域(许多 0x00 字节),后跟随机数据。

其次,我们观察到 offset0x14C33的序列5d 00 00 80 00这确实与 LZMA 压缩一致

第三,我们观察到字符串和空数据区域在 LZMA 压缩签名和随机数据之前。

这些一起很好地表明存在压缩区域。

  1. 使用熵分析确认压缩区域的存在

压缩数据通常比非随机未压缩数据具有更高的熵我们可以通过使用熵分析在二进制中定位压缩区域来利用这一点。这可以通过使用这样binwalk-E选项来完成

$ binwalk -E DSL-2520U

DECIMAL       HEXADECIMAL     ENTROPY
--------------------------------------------------------------------------------
0             0x0             Falling entropy edge (0.778887)
84992         0x14C00         Rising entropy edge (0.971648)   <----Notice
101376        0x18C00         Falling entropy edge (0.600073)
138240        0x21C00         Falling entropy edge (0.000000)
350208        0x55800         Rising entropy edge (0.966418)   <----Notice

我们在这里观察到,存在上升熵边缘的偏移量非常接近发现 LZMA 压缩签名的偏移量。

这是熵图: 二元熵图

我们可以在图中看到二进制中有 2 个区域的熵接近 1,与压缩一致。

5. 使用binvis.io等可视化工具可视化二进制文件

以下是一些可供选择的二进制可视化工具:Visualizing ELF Binaries我喜欢使用 binvis.io,因为它快速、方便并且有一些有用的功能。

可视化可以帮助快速识别二进制文件中的有趣区域。

ASCII data (blue) | | v v 字节类 ^ ^ | | compressed compressed | | v v 熵 ^ ^ | | regions of 0x00 bytes

6. 从二进制中提取数据

那些压缩区域里有什么?我们可以通过提取它们来找出。

$ binwalk -Me DSL-2520U

执行提取并扫描每个提取的块。提取的数据位于名为 的新目录中_DSL-2520U.extracted

7. 分析提取的数据

对每个提取的二进制文件重复上述步骤,但这次查找代码(将识别内核或引导加载程序等可执行文件)和文件系统,其中将包含 Web 服务器和.cgi软件等实用程序

定位代码的一种方法是使用-A带有binwalk以下参数的参数

$ binwalk -A 14C33

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
304           0x130           MIPS instructions, function epilogue
612           0x264           MIPS instructions, function epilogue
676           0x2A4           MIPS instructions, function epilogue
2576          0xA10           MIPS instructions, function epilogue
3548          0xDDC           MIPS instructions, function epilogue
3592          0xE08           MIPS instructions, function epilogue
3636          0xE34           MIPS instructions, function epilogue
3672          0xE58           MIPS instructions, function epilogue
4252          0x109C          MIPS instructions, function epilogue
4336          0x10F0          MIPS instructions, function epilogue
4420          0x1144          MIPS instructions, function epilogue
4936          0x1348          MIPS instructions, function epilogue
<snip>

优秀的。看起来二进制文件包含 MIPS 汇编代码。这可以用radare2 或IDA 或其他一些工具来分解。

这应该是足够的信息开始。

资源

这些与问题中具体询问的设备/固件无关,但devttys0 是专业人士,阅读他的帖子将使您了解如何应对逆向固件时面临的许多挑战。

提取非标准 SquashFS 图像

逆向工程固件:Linksys WAG120N

逆向工程 VxWorks 固件:WRT54Gv8

利用嵌入式系统——第 1 部分

固件.re是实验性的