如何从linux命令行查看二进制文件

有神秘档案吗?Linux file命令将快速告诉您它是什么类型的文件。如果它是一个二进制文件,你可以找到更多关于它。文件里有一大堆马厩,可以帮你分析。我们将向您展示如何使用这些工具。...

有神秘档案吗?Linux file命令将快速告诉您它是什么类型的文件。如果它是一个二进制文件,你可以找到更多关于它。文件里有一大堆马厩,可以帮你分析。我们将向您展示如何使用这些工具。

识别文件类型

文件通常具有一些特性,允许软件包识别它是哪种类型的文件,以及其中的数据表示什么。尝试在MP3音乐播放器中打开PNG文件是没有意义的,因此文件携带某种形式的ID既有用又实用。

这可能是文件开头的几个签名字节。这允许文件明确其格式和内容。有时,文件类型是从数据本身内部组织的一个独特方面推断出来的,称为文件体系结构。

有些操作系统,如Windows,完全由文件扩展名引导。您可以称之为轻信或信任,但Windows假定任何具有DOCX扩展名的文件实际上都是DOCX字处理文件。Linux不是那样的,你很快就会看到。它需要证据并在文件中查找。

这里描述的工具已经安装在我们用来研究本文的manjaro20、fedora21和ubuntu20.04发行版上。我们用文件命令开始调查吧。

使用file命令

我们在当前目录中有一个不同文件类型的集合。它们是文档、源代码、可执行文件和文本文件的混合体。

ls命令将显示目录中的内容,-hl(人类可读大小,长列表)选项将显示每个文件的大小:

ls -hl

如何从linux命令行查看二进制文件

让我们试试这些文件,看看我们得到了什么:

file build_instructi***.odt file build_instructi***.pdf file COBOL_Report_Apr60.djvu

如何从linux命令行查看二进制文件

正确识别了这三种文件格式。在可能的情况下,文件给了我们更多的信息。据报道,PDF文件为1.5版格式。

即使我们将ODT文件重命名为具有任意值XYZ的扩展名,在文件浏览器和使用file的命令行中,仍然可以正确识别该文件。

如何从linux命令行查看二进制文件

在文件浏览器中,它被赋予了正确的图标。在命令行上,file忽略扩展名并查看文件内部以确定其类型:

file build_instructi***.xyz

如何从linux命令行查看二进制文件

使用媒体上的文件(如图像和音乐文件)通常会产生有关其格式、编码、分辨率等的信息:

file screenshot.png file screenshot.jpg file Pachelbel_Canon_In_D.mp3

如何从linux命令行查看二进制文件

有趣的是,即使是纯文本文件,file也不会根据扩展名来判断文件。例如,如果您有一个扩展名为“.c”的文件,其中包含标准纯文本,但不包含源代码,则该文件不会将其误认为是真正的c源代码文件:

file function+headers.h file makefile file hello.c

如何从linux命令行查看二进制文件

文件将头文件(“.h”)正确地标识为文件的C源代码集合的一部分,并且它知道makefile是一个脚本。

将文件与二进制文件一起使用

二进制文件比其他文件更像一个“黑匣子”。可以通过适当的软件包查看图像文件、播放声音文件和打开文档文件。不过,二进制文件更具挑战性。

例如,文件“hello”和“wd”是二进制可执行文件。它们是程序。名为“wd.o”的文件是一个对象文件。当编译器编译源代码时,会创建一个或多个目标文件。这些包含计算机在完成的程序运行时最终将执行的机器代码,以及链接器的信息。链接器检查每个对象文件中对库的函数调用。它将它们链接到程序使用的任何库。这个过程的结果是一个可执行文件。

“文件”监视.exe“是已交叉编译以在Windows上运行的二进制可执行文件:

file wd file wd.o file hello file watch.exe

如何从linux命令行查看二进制文件

先拿最后一个,文件告诉我们监视.exe“文件是一个PE32+可执行控制台程序,用于Microsoft Windows上的x86系列处理器。PE代表可移植可执行格式,它有32位和64位版本。PE32是32位版本,PE32+是64位版本。

其他三个文件都被标识为可执行和可链接格式(ELF)文件。这是可执行文件和共享对象文件(如库)的标准。我们将很快了解ELF头格式。

您可能会注意到,这两个可执行文件(“wd”和“hello”)被标识为Linux标准基(LSB)共享对象,而对象文件“wd.o”被标识为LSB可重定位文件。“可执行文件”这个词显然不存在。

对象文件是可重定位的,这意味着其中的代码可以在任何位置加载到内存中。可执行文件被列为共享对象,因为它们是由链接器从对象文件创建的,这样它们就继承了这个功能。

这允许地址空间布局随机化(ASMR)系统将可执行文件加载到其选择的地址的内存中。标准可执行文件的头文件中有一个加载地址编码,该地址指示将它们加载到内存中的位置。

ASMR是一种安全技术。将可执行文件以可预测的地址加载到内存中,使它们容易受到攻击。这是因为攻击者总是知道它们的入口点和函数的位置。定位在随机地址的独立可执行文件(PIE)克服了这种敏感性。

如果我们用gcc编译器编译程序并提供-no-pie选项,我们将生成一个常规的可执行文件。

-o(输出文件)选项允许我们为可执行文件提供名称:

gcc -o hello -no-pie hello.c

我们将在新的可执行文件上使用文件,并查看发生了什么变化:

file hello

可执行文件的大小与以前相同(17 KB):

ls -hl hello

如何从linux命令行查看二进制文件

二进制文件现在被标识为标准可执行文件。我们这样做只是为了演示。如果这样编译应用程序,您将失去ASMR的所有优点。

为什么可执行文件这么大?

我们的示例hello程序是17kb,所以它很难被称为big,但是,一切都是相对的。源代码为120字节:

cat hello.c

如果它只需要在终端窗口中打印一个字符串,那么二进制文件的扩展是什么呢?我们知道有一个ELF头,但是对于一个64位二进制文件来说只有64字节长。很明显,这肯定是另外一回事:

ls -hl hello

如何从linux命令行查看二进制文件

让我们用strings命令扫描二进制文件,作为发现其中内容的简单第一步。我们将把它输送到更少的地方:

strings hello | less

如何从linux命令行查看二进制文件

二进制文件中除了“你好,极客世界!“从我们的源代码。其中大部分是二进制文件中区域的标签,以及共享对象的名称和链接信息。这些库包括二进制文件所依赖的库和这些库中的函数。

ldd命令显示二进制文件的共享对象依赖关系:

ldd hello

如何从linux命令行查看二进制文件

输出中有三个条目,其中两个包含目录路径(第一个不包含):

  • linux操作系统-vdso.so公司:虚拟动态共享对象(VDSO)是一种内核机制,允许用户空间二进制文件访问一组内核空间例程。这避免了从用户内核模式切换上下文的开销。VDSO共享对象遵循可执行和可链接格式(ELF)格式,允许它们在运行时动态链接到二进制文件。VDSO是动态分配的,并利用ASMR。如果内核支持ASMR方案,那么VDSO功能由标准gnuc库提供。
  • libc.so公司.6:GNUC库共享对象。
  • /lib64/ld-linux-x86-64.so.2:这是二进制文件想要使用的动态链接器。动态链接器询问二进制文件以发现它有哪些依赖关系。它将这些共享对象送入内存。它准备运行二进制文件,并能够找到和访问内存中的依赖项。然后,它启动程序。

精灵头像

我们可以使用readelf实用程序和-h(文件头)选项检查并解码ELF头:

readelf -h hello

如何从linux命令行查看二进制文件

标题为我们解释。

如何从linux命令行查看二进制文件

所有ELF二进制文件的第一个字节被设置为十六进制值0x7F。接下来的三个字节被设置为0x45、0x4C和0x46。第一个字节是将文件标识为ELF二进制文件的标志。为了清楚地说明这一点,接下来的三个字节用ASCII码拼写出“ELF”:

  • 类:指示二进制文件是32位还是64位可执行文件(1=32,2=64)。
  • 数据:表示正在使用的endianness。Endian编码定义了多字节数的存储方式。在big-endian编码中,首先存储一个数字的最高有效位。在little endian编码中,首先存储数字的最低有效位。
  • 版本:ELF的版本(目前是1)。
  • OS/ABI:表示正在使用的应用程序二进制接口的类型。这定义了两个二进制模块(如程序和共享库)之间的接口。
  • ABI版本:ABI的版本。
  • 类型:ELF二进制文件的类型。常见的值是可重定位资源(如对象文件)的ET\u REL、使用-no pie标志编译的可执行文件的ET\u EXEC和支持ASMR的可执行文件的ET\u DYN。
  • 机器:指令集结构。这表示为其创建二进制文件的目标平台。
  • 版本:对于这个版本的ELF,总是设置为1。
  • 入口点地址:二进制文件中开始执行的内存地址。

其他条目是二进制文件中区域和部分的大小和数量,因此可以计算它们的位置。

使用hexdump快速查看二进制文件的前8个字节,将显示文件前4个字节中的签名字节和“ELF”字符串。-C(canonical)选项为我们提供字节的ASCII表示及其十六进制值,-n(number)选项让我们指定要查看的字节数:

hexdump -C -n 8 hello

如何从linux命令行查看二进制文件

objdump和粒度视图

如果您想查看细节,可以使用objdump命令和-d(反汇编)选项:

objdump -d hello | less

如何从linux命令行查看二进制文件

这将反汇编可执行的机器代码,并以十六进制字节与汇编语言等价物一起显示。每行中第一个bye的地址位置显示在最左边。

只有当你能读懂汇编语言,或者你好奇幕后发生了什么时,这才有用。有很多输出,所以我们把它输送到更少的地方。

如何从linux命令行查看二进制文件

编译和链接

有许多方法可以编译二进制文件。例如,开发人员选择是否包含调试信息。二进制文件的链接方式也影响其内容和大小。如果二进制引用将对象作为外部依赖项共享,那么它将小于依赖项静态链接到的对象。

大多数开发人员已经知道我们在这里介绍的命令。不过,对于其他人来说,它们提供了一些简单的方法来翻查二进制黑盒中的内容。

  • 发表于 2021-04-02 04:41
  • 阅读 ( 356 )
  • 分类:互联网

你可能感兴趣的文章

这就是软件安装程序在windows、macos和linux上的工作方式

...例中,我使用了文档转换器Pandoc。它包括/usr/local/bin中的二进制文件和/usr/local/share/man中的一些文档。这些东西到底是如何到位的?我们来看看每一个都是如何安装到你的Mac上的。 ...

  • 发布于 2021-03-14 18:20
  • 阅读 ( 265 )

哪个linux shell最好?比较了5种常见的贝壳

...,你的计算机把所有东西都看成是1s,或者是众所周知的二进制代码或机器代码。 ...

  • 发布于 2021-03-30 18:45
  • 阅读 ( 371 )

如何在linux上使用seq命令

Linux seq命令可以在眨眼之间生成数字列表。但是如何将这个功能付诸实际使用呢?我们将向您展示seq如何为您带来便利。 seq命令 乍一看,Linux seq命令似乎有些奇怪。它可以让你快速生成数字序列,就这样!不过,这里的关键...

  • 发布于 2021-04-01 11:46
  • 阅读 ( 157 )

如何在linux中向$path添加目录

...他内容混合的命令名。然后,它会找到这些命令的可执行二进制文件,并使用您提供的参数启动它们。 shell定位可执行文件的第一步是确定是否包含二进制文件。如果您使用的命令位于shell本身(“shell内置”)中,则无需进一...

  • 发布于 2021-04-02 14:04
  • 阅读 ( 186 )

如何在linux上删除用户(并删除所有跟踪)

...我有一半希望其中一个是另一个的别名,但它们是不同的二进制文件。 type deluser type userdel 尽管两者都可用,但建议在Debian衍生发行版上使用deluser: “userdel是一个用于删除用户的低级实用程序。在Debian上,管理员通常应该改...

  • 发布于 2021-04-02 15:16
  • 阅读 ( 177 )

如何在linux上使用fold命令

...读取大量文本、无穷无尽的字符串和未格式化的流。学习如何。 linux终端中文本行的工作原理 Linux战斗的第一条规则:了解你的敌人。让我们来定义它。一行文字到底是什么?它是由字母、数字、符号和空格组成的一系列字符...

  • 发布于 2021-04-02 16:13
  • 阅读 ( 187 )

如何使用journalctl读取linux系统日志

...的、专用的日志解决方案收集和管理。它们存储的格式是二进制的。这有助于以不同的格式提取数据,如我们将看到的JSON。 它还可以更容易地交叉引用以前记录在单独日志文件中的相关信息。因为数据现在保存在一个单独的日...

  • 发布于 2021-04-02 17:06
  • 阅读 ( 175 )

如何在linux上使用tail命令

...格式。在systemd下,它们不再以纯文本形式创建,而是以二进制格式记录。要读取这些日志文件,必须使用journactl实用程序。tail命令适用于纯文本格式。它不读取二进制文件。那么,这是否意味着tail命令是寻找问题的解决方案呢...

  • 发布于 2021-04-02 17:32
  • 阅读 ( 183 )

如何在linux上使用stat命令

...,而且您不必记住一组晦涩难懂的命令行选项。 相关:如何使用ls命令列出Linux上的文件和目录 快速比较 让我们使用ls给出一个长列表(-l选项),其中包含人类可读的文件大小(-h选项): ls -lh ana.h 从左到右,ls提供的信息是...

  • 发布于 2021-04-02 19:25
  • 阅读 ( 164 )

linux下如何使用which命令

Linux which命令标识在向shell发出命令时启动的可执行二进制文件。如果您的计算机上有同一程序的不同版本,您可以使用哪个来确定shell将使用哪个版本。 二进制文件和路径 当您试图从终端窗口运行程序或命令时,shell(通常是...

  • 发布于 2021-04-02 20:07
  • 阅读 ( 170 )
ahj28578
ahj28578

0 篇文章

相关推荐