• 全部文章 专栏目录
  • 互动问答
  • 雨果的书房作者
    2020-05-07 08:32:34
    掌握这10种方法帮你快速在Linux上分析二进制文件

    导读:这些简单的命令和工具可以帮助您轻松完成分析二进制文件的任务。

    我们每天都使用二进制文件,但对二进制文件知之甚少。二进制是指您每天运行的可执行文件,从命令行工具到成熟的应用程序。Linux提供了丰富的工具集,可轻松进行二进制分析!无论您的工作角色是什么,如果您在Linux上工作,了解有关这些工具的基础知识将有助于更好地理解你的系统。

    在本文中,我们将介绍这些Linux工具和命令中流行的一些,其中大多数将作为你的Linux发行版的一部分在本地就可提供。如果没有,您可以随时使用软件包管理器来安装和浏览它们。请记住:在适合的场合学习使用正确的工具需要足够的耐心和练习。

    更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”

    方法1:file

    作用:帮助确定文件类型。

    这将是您进行二进制分析的起点。我们每天处理文件,并非所有的东西都是可执行的类型,文件类型非常宽泛。在开始之前,您需要了解要分析的文件类型。它是二进制文件,库文件,ASCII文本文件,视频文件,图片文件,PDF,数据文件等等。

    该file的命令将帮助你确定你即将处理的文件的确切类型。

    方法2:ldd

    作用:打印共享对象依赖性。

    如果您已经在可执行二进制文件上使用了上面的file命令,你不要错过输出中的“动态链接”这条消息。这条消息是什么意思?

    开发软件时,我们尽量不要重新发明轮子。大多数软件程序需要执行一组通用任务,例如打印输出或从标准文件中读取或打开文件等。所有这些通用任务都通过一组通用函数抽象出来,每个人都可以使用它们代替编写自己的变体。这些通用函数被放在名为libc  或  glibc的库中。

    如何找到某一个可执行文件所依赖的库?这就是ldd命令出现的地方。针对动态链接的二进制文件运行它,会显示所有它所依赖的库及路径。

    方法3:ltrace

    作用:跟踪进程调用库函数的情况。

    现在,我们知道如何使用ldd命令查找可执行程序所依赖的库。但是,一个库可以包含数百个函数。在这数百种中,我们的二进制文件实际使用的功能是什么?

    该ltrace命令将显示所有在运行时间里被从库里调用的函数。在下面的示例中,您可以看到正在调用的函数名称以及传递给该函数的参数。您还可以在输出的右侧看到这些函数返回的内容。

    方法4:Hexdump

    作用:以ASCII、十进制、十六进制或八进制显示文件内容。

    通常,您在一个应用程序中打开一个文件都会不知道怎么打开这个文件。尝试使用vim打开一个可执行文件或一段视频文件,但是您通过屏幕看到的总是一堆乱码。

    在Hexdump中打开未知文件,可帮助您准确地查看文件中包含的内容。您也可以使用一些命令行选项,有选择地查看文件中这些数据的ASCII表示形式。这可能有助于您了解文件的类型。

    方法5:strings

    作用:打印文件中可打印字符的字符串。

    如果Hexdump在您的用例中看起来有点过大,而您只是在二进制文件中寻找可打印的字符,则可以使用  strings  命令。

    开发软件时,会向其中添加各种文本/ ASCII消息,例如打印信息的消息、调试信息、帮助消息和错误等。如果所有这些信息都存在于二进制文件中,它将以字符串的形式转储到屏幕上 。

    更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”

    方法6:readelf

    作用:显示有关ELF文件的信息。

    ELF(可执行文件和可链接文件格式)是可执行文件或二进制文件的主要文件格式,不仅在Linux上,在各种UNIX系统上也是如此。如果您使用过诸如file命令之类的工具,该工具会告诉您该文件为ELF格式,那么下一步将是使用  readelf  命令及其各种选项来进一步分析该文件。

    当使用readelf时,方便地参考实际ELF规范是非常有用的。您可以在此处找到ELF规范。 

    方法7:objdump

    作用:显示来自目标文件的信息。

    当您编写源代码时会创建二进制文件,而使用称为编译器的工具会对其进行编译。该编译器生成与源代码等效的机器语言指令,然后可由CPU执行一个给定的任务。这种机器语言编码可以通过称为汇编语言的助记符来解释该机器语言代码。汇编语言是一组指令,可以帮助您了解程序正在执行的操作以及终在CPU上执行的操作。

    objdump 效用是读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编知识对于理解objdump  命令的输出至关重要  。

    请记住:汇编语言是特定于体系结构的。

    方法8:strace

    作用:跟踪系统调用和信号。

    如果您使用了 前面提到的ltrace,请考虑 一下strace 是相似的。的区别是,strace 的效用可以跟踪系统调用,而不是调用库 。系统调用是您与内核交互以完成工作的方式。

    举个例子,如果您想在屏幕上打印一些东西,您将使用 标准库libc中的 printf 或 puts函数;但是,在幕后,终将调用名为write的系统,打印东西到屏幕上。

    方法9:nm

    作用:列出目标文件中的符号。

    如果您使用的是未剥离的二进制文件,则  nm  命令将为您提供在编译过程中嵌入在二进制文件中的有价值的信息。nm 可以帮助您从二进制文件中识别变量和函数。您可以想象如果您无法访问所分析的二进制代码的源代码,这将有多大用处。

    为了展示nm,我们将快速编写一个小程序并使用-g  选项对其进行编译 ,并且还将看到使用file命令不会剥离二进制文件。

    方法10:gdb

    作用:GNU调试器。

    好吧,并不是二进制文件中的所有内容都可以静态分析。我们确实执行了一些运行二进制文件的命令,例如  ltrace 和 strace;但是,软件包含各种条件,可能导致执行各种替代路径。

    分析这些路径的方法是在运行时通过能够在任何给定位置停止或暂停程序并能够分析信息,然后进一步向下移动来进行分析。这就是调试器出现的地方,在Linux上,gdb 是事实上的调试器。它可以帮助您加载程序,在特定位置设置断点,分析内存和CPU寄存器以及执行更多操作。它是上述其他工具的补充,使您可以进行更多运行时的分析。

    需要注意的一件事是,一旦使用gdb加载了程序,就会看到它自己的(gdb)提示符。所有其他命令将在此gdb  命令提示符下运行,  直到退出。我们将使用先前编译的“ hello”程序,并使用 gdb 查看其工作方式。

    更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”

    结论:

    一旦您对使用这些本机Linux二进制分析工具感到满意,并理解了它们提供的输出,就可以使用更和专业的开源二进制分析工具,例如  radare2。

    1
    0
    开源哪些事儿
    创建时间:2020-05-07 08:31:45
    聚焦开源服务开源
    展开
    订阅须知

    • 所有用户可根据关注领域订阅专区或所有专区

    • 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

    • 专区发布评论属默认订阅所评论专区(除付费小栈外)

    作者

    • 雨果的书房
      作者
    戳我,来吐槽~