#1 楼
注意:问题是这样的尝试非常针对一个人正在查看的文件。因此,在必要时,要偏离这里列出的路径,需要很多常识和大概的经验。好吧,您有很多选择,我们所有人都可能对此有所了解。 br />
我将以
file
(此处为Windows版本)开头。如果失败,我将在网络上搜索前8到16个字节的十六进制值以查看发生了什么。另外,我会输入适合我的情况的搜索字词。
没有产生任何结果,我将继续观察是否可以说服工具
strings
向我展示有用的东西(Sysinternals提供了Windows版本的字符串) 。这可能已经足够了。但是,如果文件包含压缩或加密的Blob,我现在要带入firmware-mod-kit。它可以直接从SVN构建(仅在几天前进行了测试),包括
binwalk
,还可以解包一些initrd
,而香草binwalk
无法解包。或者,您可以尝试find-firmware.pl
(或者通常是它的一部分脚本集)全部失败,我将在支持某种二进制模板(例如010 Editor或免费软件Neo)的十六进制编辑器中打开文件。 )。
...从那里我会寻找模式。这就是很难描述我如何打勾的地方,这是视觉上的事情。基本上,我会寻找偏移量,但是在某些情况下,
00
和非00
的模式也会使我失望。另外,如果十六进制编辑器具有直方图功能,则我可能会使用直方图功能,以查看特定的数据块是否可能被加密或压缩(这两者都使字节值分布相对均匀)。知道平台(PPC)是Big Endian,因此我认为偏移量也将是Big Endian。这样将打开该设置,然后查看是否可以解码文件头之类的含义。如果可以,那么我将检查找到的所有斑点,看看是否可以从中识别出某种信息,例如压缩算法。例如,gzip
具有特定的前导字节,而原始deflate
除非程序员选择使用它们,否则不会。如果所有这些都失败了,我暂时必须假定这是其他某种压缩格式,并且将使用LZMA SDK作为参考来提出一种工作理论,该理论(通常是之前的binwalk
步骤负责完成)那)。寻找这些指纹,我希望能够提取本身就是文件的blob,并且可以由外部工具处理。如果所有这些先前的方法都将失败,我将着手查找应该在某种程度上了解文件格式的软件,例如将固件文件作为输入的固件刷新程序。
NB:如果固件blob来自驱动程序,例如在Linux中,您当然会先从该驱动程序中寻找线索。
原始答案(在很明显这是固件二进制文件之前)
我将从
file
命令开始(这里是Windows版本,这要感谢amccormack-参见他的评论)。它通常会告诉您构建操作系统(和内核等)的众所周知的可执行格式。示例:
# On an AIX 5.3 machine
$ file python
python: executable (RISC System/6000) or object module not stripped
# Debian 6 on PPC64
$ file python
python: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, with unknown capability 0x41000000 = 0x13676e75, with unknown capability 0x10000 = 0xb0401, stripped
# Ubuntu 10.04, x64
$ file python
python: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
# Windows
>file C:\Python27\python.exe
C:\Python27\python.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
#2 楼
正如0xC0000022L已经指出的那样,字符串实际上是第一步。由于这是您直接从闪存芯片获得的转储,因此应该有一些可读的字符串(例如来自引导加载程序的字符串),除非已对其进行了加密。您提到它是基于PPC的设备,因此您还可以搜索常见的PPC操作码(binwalk可以执行此操作,请指定-A选项);您应该至少看到一些操作码弹出。
要检查的另一件事是二进制数据的熵(binwalk的-E选项可以做到这一点,许多其他工具也可以做到)。固件通常会压缩某些部分(例如内核和文件系统),这将在固件映像中显示为单独的非常高的熵部分。字符串和代码具有中等熵。加密的数据具有很高的熵。
设备的硬件也可以为您提供一些线索。闪存很少(例如2MB或更少)的设备不太可能运行大型操作系统,例如Linux。他们可能正在运行某种较小的RTOS。
还要考虑的另一件事是如何丢弃闪存,闪存是什么类型以及闪存芯片的数据总线。例如,在小端系统上以16位模式运行的并行闪存芯片每两个字节翻转一次。因此,如果您以16位模式原始读取芯片,则字符串“ ABCD”将被读出为“ BADC”。显然,这会搞乱任何基于签名的分析,并导致字符串看起来很陌生,但同时却不可读。
评论
是的,我以正确的字节序挖过字符串,但没有看到任何使操作系统尖叫的东西。我不确定操作码将如何提供帮助,但是感谢IdaPro,我已经将它们全部翻译了。
–千兆瓦
13年4月18日在17:40
好吧,如果有有效的操作码,则至少其中一部分不会被压缩/加密。该代码可能是引导加载程序或解压缩程序存根,它们可能具有或可能不具有有关OS类型的任何信息(甚至知识)。我会寻找可能表明固件中还有其他内容的字符串/功能。
–devttys0
2013年4月19日在3:46
抱歉,我很新,不知道会感兴趣的字符串。我已经提到,我已经找到了/ dev / tty和/ dev / lp以及stdin,stdout和stderr。我只是不知道它们的重要性。
–千兆瓦
13年4月19日在11:58
例如,如果您看到读取诸如解压缩主映像或解压缩内核之类的字符串,则表明该代码至少负责解压缩固件映像中的其他数据。它还可能会引用所使用的特定压缩算法,例如LZMA或GZIP。
–devttys0
13年4月20日在1:04
#3 楼
这不是火箭科学。 IDA不是用于进行此简单确定的工具。检查固件映像中找到的字符串。如果找不到任何内容,则可能会对它进行整体加密和/或压缩。无论哪种情况,请尝试Binwalk以获得其他帮助。固件中使用的文件系统类型也可能是一个线索。此外,可能的选择不多。一些是(最常见的粗体):
Linux(各种分支,uLinux,OpenWrt等)
VxWorks
BSD(各种分支机构,iOS就是其中之一)。
LynxOS
QNE
QNX
Windows CE
Windows NT Embedded
<<可能是VxWorks,这是WR54G(S)v5中使用的一种可能的标头数据结构,如此处所述。
////////////////////////////////////////////////////////////////
// Linksys VxWorks based firmware image format
#pragma pack(1)
typedef struct _VxFileDescriptor
{
DWORD nFileId_BigEnd; // file type (see below)
DWORD nFileSize_BigEnd;
} VxFileDescriptor, *pVxFileDescriptor;
typedef struct _VxLinksysHeader
{
DWORD nCodePattern;
BYTE cUnknown_4[4];
BYTE cYear;
BYTE cMonth;
BYTE cDay;
BYTE nProductVersion_0;
BYTE nMinorVersion_0;
BYTE cZUnknown_0D;
BYTE cImageFormatVersion[4];
BYTE cZUnknown_12[238];
//
// offset 0x100 -- begining of an secondary header?
//
// After this point, all integers are stored big endian
// and should be read by endian neutral code
// (that is, read as big endian).
//
BYTE nProductVersion_1;
BYTE nMinorVersion_1;
WORD nMajorVersion_1;
BYTE cZUnknown_104[2];
WORD nHeaderSizeBigEnd;
DWORD nChecksumBigEnd;
BYTE cZUnknown_10B[2];
WORD nUnknown_10D;
BYTE cZUnknown_110[0x30];
BYTE cModelName[0x20];
BYTE cVendorName[0x20];
VxFileDescriptor TrailingFiles[8];
// parts of file that follow primary file descriptors
VxFileDescriptor FileDescriptors[8];
// primary file descriptors, immediately follow header
} VxLinksysHeader, *pVxLinksysHeader;
评论
实际上,基本上所有BSD也是可能的选择-可能最值得注意的是NetBSD。 +1
– 0xC0000022L♦
13年4月16日在20:33
真正!说到BSD衍生产品,我正在考虑列出iOS,Android和其他移动平台,因为它们可以用于嵌入式系统,并且无论如何手机几乎都属于此类。
–达斯塔
13年4月17日在0:49
我开始相信这是VxWorks,但不知道我在寻找什么来肯定地说这是VxWorks。
–千兆瓦
13年4月18日在17:46
通常,您会在某处看到Wind River的版权。如果看不到任何纯文本,则必须将该图像恢复为纯状态以进行分析。当我处理Wx54G(S)的VxWorks版本时,我颠倒了VxWorks标头格式。谁知道,也许会是相同还是相似。我更新了答案。链接在这里:bitsum.com/openwiking/owbase/WRT54G5_CFE
–达斯塔
2013年4月19日下午4:16
#4 楼
大多数操作系统中都有某种字符串,用于标识操作系统和版本。因此,通过使用十六进制编辑器查看文件,您通常可以识别os。否则,您需要搜索已知的签名/足迹。评论
签名/足迹是什么意思?
–千兆瓦
13年4月18日在17:45
他表示一组字节或标记,用于标识图像类型或图像中的数据结构。这些通常是数据结构定义中的第一个字段,尽管不一定必须如此。
–达斯塔
2013年4月19日下午4:27
评论
如果要从Windows运行文件,请访问此站点。它本地安装在大多数linux安装中。
– amccormack
2013年4月16日15:45
没有运气找到它,虽然这是组装,所以我不确定它会那么容易掉出来。我发现dev / tty和dev / lp似乎指向Unix
–千兆瓦
2013年4月16日16:00
对困惑感到抱歉。我有将原始位加载到PowerPC中的信息。这根本不是可执行文件,只是从附带的闪存中获取内存。我已将其放入Ida Pro,并将其转换回装配体。这是我所取得的成就。我说过我是纽伯:)
–千兆瓦
13年4月16日在16:14
是的,这是固件。 Binwalk运气不好,对固件mod-kit一点都不熟悉。
–千兆瓦
13年4月16日在16:24
抱歉,我在措辞上感到困惑,希望编辑能有所帮助。
–千兆瓦
13年4月16日在18:27