掌握这10种方法帮你快速在Linux上分析二进制文件
我们每天都使用二进制文件,但对二进制文件知之甚少。二进制是指您每天运行的可执行文件,从命令行工具到成熟的应用程序。Linux提供了丰富的工具集,可轻松进行二进制分析!无论您的工作角色是什么,如果您在Linux上工作,了解有关这些工具的基础知识将有助于更好地理解你的系统。
在本文中,我们将介绍这些Linux工具和命令中最流行的一些,其中大多数将作为你的Linux发行版的一部分在本地就可提供。如果没有,您可以随时使用软件包管理器来安装和浏览它们。请记住:在适合的场合学习使用正确的工具需要足够的耐心和练习。
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
方法1:file
作用:帮助确定文件类型。
这将是您进行二进制分析的起点。我们每天处理文件,并非所有的东西都是可执行的类型,文件类型非常宽泛。在开始之前,您需要了解要分析的文件类型。它是二进制文件,库文件,ASCII文本文件,视频文件,图片文件,PDF,数据文件等等。
该file的命令将帮助你确定你即将处理的文件的确切类型。
方法2:ldd
作用:打印共享对象依赖性。
如果您已经在可执行二进制文件上使用了上面的file命令,你不要错过输出中的“动态链接”这条消息。这条消息是什么意思?
开发软件时,我们尽量不要重新发明轮子。大多数软件程序需要执行一组通用任务,例如打印输出或从标准文件中读取或打开文件等。所有这些通用任务都通过一组通用函数抽象出来,每个人都可以使用它们代替编写自己的变体。这些通用函数被放在名为libc 或 glibc的库中。
如何找到某一个可执行文件所依赖的库?这就是ldd命令出现的地方。针对动态链接的二进制文件运行它,会显示所有它所依赖的库及路径。
方法3:ltrace
作用:跟踪进程调用库函数的情况。
现在,我们知道如何使用ldd命令查找可执行程序所依赖的库。但是,一个库可以包含数百个函数。在这数百种中,我们的二进制文件实际使用的功能是什么?
该ltrace命令将显示所有在运行时间里被从库里调用的函数。在下面的示例中,您可以看到正在调用的函数名称以及传递给该函数的参数。您还可以在输出的最右侧看到这些函数返回的内容。
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
方法4:Hexdump
作用:以ASCII、十进制、十六进制或八进制显示文件内容。
通常,您在一个应用程序中打开一个文件都会不知道怎么打开这个文件。尝试使用vim打开一个可执行文件或一段视频文件,但是您通过屏幕看到的总是一堆乱码。
在Hexdump中打开未知文件,可帮助您准确地查看文件中包含的内容。您也可以使用一些命令行选项,有选择地查看文件中这些数据的ASCII表示形式。这可能有助于您了解文件的类型。
方法5:strings
作用:打印文件中可打印字符的字符串。
如果Hexdump在您的用例中看起来有点过大,而您只是在二进制文件中寻找可打印的字符,则可以使用 strings 命令。
开发软件时,会向其中添加各种文本/ ASCII消息,例如打印信息的消息、调试信息、帮助消息和错误等。如果所有这些信息都存在于二进制文件中,它将以字符串的形式转储到屏幕上 。
方法6:readelf
作用:显示有关ELF文件的信息。
ELF(可执行文件和可链接文件格式)是可执行文件或二进制文件的主要文件格式,不仅在Linux上,在各种UNIX系统上也是如此。如果您使用过诸如file命令之类的工具,该工具会告诉您该文件为ELF格式,那么下一步将是使用 readelf 命令及其各种选项来进一步分析该文件。
当使用readelf时,方便地参考实际ELF规范是非常有用的。您可以在此处找到ELF规范。
方法7:objdump
作用:显示来自目标文件的信息。
当您编写源代码时会创建二进制文件,而使用称为编译器的工具会对其进行编译。该编译器生成与源代码等效的机器语言指令,然后可由CPU执行一个给定的任务。这种机器语言编码可以通过称为汇编语言的助记符来解释该机器语言代码。汇编语言是一组指令,可以帮助您了解程序正在执行的操作以及最终在CPU上执行的操作。
objdump 效用是读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编知识对于理解objdump 命令的输出至关重要 。
请记住:汇编语言是特定于体系结构的。
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
方法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。
掌握这10种方法帮你快速在Linux上分析二进制文件的更多相关文章
- C 程序提升效率的10种方法
本文向你介绍规范你的C代码的10种方法(引用地址http://forum.eepw.com.cn/thread/250025/1). 1. 避免不必要的函数调用 考虑下面的2个函数: void s ...
- 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app
为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...
- 让C程序更高效的10种方法(转)
原文:http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一 ...
- 让C程序更高效的10种方法
http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一个程序 ...
- Microsoft.VisualBasic.dll的妙用and 改善C#公共程序类库质量的10种方法
Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦) 前言 做过VB开发的都知道,有一些VB里面的好的函数在.NET里面都没有,而Microsoft.VisualBasic. ...
- 人工智能改进传统云ERP的10种方法
http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...
- 利用Linux系统生成随机密码的10种方法【转】
Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...
- Linux下查看压缩文件内容的 10 种方法
Linux下查看压缩文件内容的 10 种方法 通常来说,我们查看归档或压缩文件的内容,需要先进行解压缩,然后再查看,比较麻烦.今天给大家介绍 10 不同方法,能够让你轻松地在未解压缩的情况下查看归档或 ...
- 改善C#公共程序类库质量的10种方法
最近重构一套代码,运用以下几种方法,供参考. 1 公共方法尽可能的使用缓存 public static List<string> GetRegisteredCompany() { Str ...
随机推荐
- 4. js
1.) ~ 操作符 console.log(~-2) // 1 console.log(~-1) // 0 console.log(~0) // -1 console.log(~1) // ...
- ubuntu搭建vulhub漏洞环境
0x01 简介 Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场镜像.旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身. ...
- nodejs之https双向认证
说在前面 之前我们总结了https的相关知识,如果不懂可以看我另一篇文章:白话理解https 有关证书生成可以参考:自签证书生成 正题 今天使用nodejs来实现https双向认证 话不多说,直接进入 ...
- Java 多线程 -- 协作模型:生产消费者实现方式二:信号灯法
使用信号灯法实现生产消费者模式需要借助标志位. 下面以演员表演,观众观看电视为列,写一个demo 同一资源 电视: //同一资源 电视 class Tv { String voice; // 信号灯 ...
- php最快捷的插入数据,3000万仅需5秒
<?phpheader('content-type:text/html;charset=utf-8');//采集数据$url="http://www.keepclub.com/club ...
- java中ThreadLocal的使用
文章目录 在Map中存储用户数据 在ThreadLocal中存储用户数据 java中ThreadLocal的使用 ThreadLocal主要用来为当前线程存储数据,这个数据只有当前线程可以访问. 在定 ...
- Linux 设置秘钥登录(SSH免密连接)
Secure Shell 协议,简称 SSH,是一种加密网络协议,用于客户端和主机之间的安全连接,并支持各种身份验证机制,目前最实用的身份验证机制就是基于密码的身份验证和基于公钥的身份验证两种.Lin ...
- 压缩工具gzip、bzip2、xz的使用
2019独角兽企业重金招聘Python工程师标准>>> 本文使用 为了要压缩 常见压缩格式 压缩工具 gzip压缩工具 bz2压缩工具 xz压缩工具 为什么要压缩 为什么要压缩?文件 ...
- 代码,绘画,设计常用的颜色名称-16进制HEX编码-RGB编码 对照一览表
排列方式,英文名称的字典序 颜色名 HEX16进制编码 RGB编码 AliceBlue F0F8FF 240,248,255 AntiqueWhite FAEBD7 250,235,215 Aqua ...
- CF1328E Tree Queries
CF1328E Tree Queries 应该还是比较妙的 题意 给你一个树,然后多次询问 每次询问给出一堆节点,问你是否能找到一个从根出发的链,是的对于给出的每个节点,都能找出链上的点,是的他们的距 ...