1、 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以:
$ strings cr1 | more
里面可能会有一些对于这个cr1的描述,这些信息
都是编译之后在程序中留下的一些文本性的说明,所以可能会告诉你这个文件是什么.
比如有输出:
$ strings cr1 | more
%s %s %s%s%s -> %s%s%s (%.*s)
Version: 2.3
Usage: dsniff [-cdmn] [-i interface] [-s snaplen] [-f services]
[-t trigger[,...]] [-r|-w savefile] [expression]
...
/usr/local/lib/dsniff.magic
/usr/local/lib/dsniff.services
...
那么我们就可以知道,其实 cr1就是dsniff命令.
2、 如果这样的方法没有帮助你的话,那么你可以尝试:
$ /usr/ccs/bin/nm -p cr1 | more
比如说得到如下输出:
cr1:
[Index] Value Size Type Bind Other Shndx Name
[180] |0 | 0| FILE | LOCL | 0 |ABS | decode_smtp.c
[2198] |160348| 320| FUNC | GLOB | 0 | 9 | decode_sniffer
这些都是生成这个二进制文件的obj文件的文件名称,这些名称会告诉你这个二进制文件的作用的.
同样,如果希望
查看二进制文件
调用到的静态库文件都有哪些的话,可以使用nm -Du cr1来实现.
3、 当然我们也可以通过使用dump命令来得到任何一个二进制文件的选定部分信息
$ /usr/ccs/bin/dump -c ./cr1 | more
dump命令的参数说明:
-c Dump出字符串表
-C Dump出C++符号表
-D Dump出调试信息
-f Dump出每个文件的头
-h Dump出section的头
-l Dump出行号信息
-L Dump出动态与静态链接库部分内容
-o Dump出每个程序的可执行头
-r Dump出重定位信息
-s 用十六进制信息
Dump出section的内容
-t Dump符号表.
4、 可以使用file命令得到二进制文件的信息
$ file cr1
5、 如果还是不清楚的话,那么我们可以使用ldd命令
$ ldd cr1
比如说输出为:
...
libsocket.so.1 => /usr/lib/libsocket.so.1
librpcsvc.so.1 => /usr/lib/librpcsvc.so.1
...
那么我们就可以知道这个程序与网络库相关,我们就可以知道它的大概功能了.
我们也可以能过adb命令来得到一个二进制文件的执行过程.
比如说:
$ adb cr1
:r
Using device /dev/hme0 (promiscuous mode)
192.168.2.119 -> web TCP D=22 S=1111 Ack=2013255208
Seq=1407308568 Len=0 Win=17520
web -> 192.168.2.119 TCP D=1111 S=22 Push Ack=1407308568
我们知道这个程序是一个sniffer.
6、 如果你确定要运行这个程序的话,你可以先通过:
$ truss -f -o cr.out ./cr1
listening on hme0
^C
$
truss命令可以帮你打开系统的信号与调用输出.你就可以知道这个程序到底干了什么.
有了上面这些工具的话,我们就可以大概了解到一个未知的二进制程序到底是干什么的.
最后提示大家,运行不了解的二进制程序有严重的安全问题,请大家小心.
上次调试一个程序。程序在使用dlopen()出现错误。错误信息是加载动态库时,动态库中有未定义的符号。明明知道是动态库的问题,可是自己找了半天,
没解决问题。张博士过来,一个ldd查看一下动态库就判断库有问题,再一个nm就找到错误的地方,然后重新ld了一下库,问题解决了。神奇了!我也用这几
个命令检查过库,就是没发现问题,还是对命令的用法不熟啊。
这里把这几个命令好好整理一下,也算帮助记忆吧。(翻译的成居多,hehe)
nm命令
这个命令列出目标文件的符号。如果没有指定目标文件,默认是a.out。
命令大纲
nm [-a
|--debug-syms
] [-g
|--extern-only
]
[-B
] [-C
|--demangle
[=style
]] [-D
|--dynamic
]
[-S
|--print-size
] [-s
|--print-armap
]
[-A
|-o
|--print-file-name
]
[-n
|-v
|--numeric-sort
] [-p
|--no-sort
]
[-r
|--reverse-sort
] [--size-sort
] [-u
|--undefined-only
]
[-t
radix
|--radix=
radix
] [-P
|--portability
]
[--target=
bfdname
] [-f
format
|--format=
format
]
[--defined-only
] [-l
|--line-numbers
] [--no-demangle
]
[-V
|--version
] [-X 32_64
] [--help
] [objfile
...]
输出格式
nm命令的输出包含三个部分:1 符号值。默认显示十六进制,也可以指定; 2 符号类型。小写表示是本地符号,大写表示全局符号(external); 3 符号名称。 给个例子:
08049ad8 A __bss_start
080485e8 t call_gmon_start
08049ad8 b completed.1
下面把符号类型介绍一下(我就是不熟悉符号类型,才对错误没这么敏感)
A
符号值是绝对的。在进一步的连接中,不会被改变。B
符号位于未初始化数据段(known as BSS).
C
共用(common)符号. 共用符号是未初始化的数据。在连接时,多个共用符号可能采用一个同样的名字,如果这个符号在某个地方被定义,共用符号被认为是未定义的引用.
D
已初始化数据段的符号
G
已初始化数据段中的小目标(small objective)符号. 一些目标文件格式允许更有效的访问小目标数据,比如一个全局的int变量相对于一个大的全局数组。
I
其他符号的直接应用,这是GNU扩展的,很少用了.
N
调试符号.
R
只读数据段符号.
S
未初始化数据段中的小目标(small object)符号.
T
代码段的符号.
U
未定义符号.
V
弱对象(weak object)符号. 当一个已定义的弱符号被连接到一个普通定义符号,普通定义符号可以正常使用,当一个未定义的弱对象被连接到一个未定义的符号,弱符号的值为0.
W
一个没有被指定一个弱对象符号的弱符号(weak symbol)。
-
a.out目标文件中的刺符号(stabs symbol). 这种情况下,打印的下一个值是其他字段,描述字段,和类型。刺符号用于保留调试信息.
?
未知符号类型,或者目标文件特有的符号类型.命令参数
-t
radix
--radix=
radix
符号值得进制。d
十进制, o
八进制, x
十六进制.-D
--dynamic
显示动态符号,只在对象是动态时有用.
-f
format
--format=
format
输出的格式,有"bsd","sysv" 或"posix"可选。默认是“bsd”.
-g
--extern-only
只显示外部符号.
-l
--line-numbers
对每一个符号,使用调试信息去查找文件名和行号。-u
--undefined-only
只显示未定义的符号.
--defined-only
只显示已定义的符号.--help
显示帮助
分享到:
相关推荐
### 学习Linux二进制分析 #### 一、引言 在当今的软件安全领域,二进制分析成为了一项至关重要的技能。无论是对于安全研究人员还是开发人员来说,掌握这项技术都能够在软件的安全性和稳定性方面发挥重要作用。本书...
为了查看和解析二进制文件,我们可以使用各种工具,如`hexdump`(在Linux或MacOS中)、`xxd`(跨平台)或Windows的`Resource Hacker`。这些工具将二进制数据转换为十六进制表示,便于分析。例如,打开一个二进制文件...
静态插桩在编译时或链接时进行,而动态插桩则在程序运行时进行,这使得它对未编译的二进制文件或动态链接库也有效。 插桩原理通常基于两种技术:指令替换和钩子函数。指令替换是在原始指令中嵌入新的指令序列,而...
在IT领域,开发跨平台的软件工具是一项挑战,而“二进制文件编辑器qt编写”项目就是一个很好的实例,展示了如何使用Qt框架来创建这样一个工具。Qt是一个强大的C++库,支持多平台应用开发,包括Linux和Windows。这个...
010Editor是一款专业的二进制文件编辑器,它提供了强大的功能,使用户能够深入到文件的二进制层面进行编辑和分析。在IT行业中,尤其是软件开发、逆向工程和数据分析等领域,010Editor是一款不可或缺的工具。 首先,...
在Linux环境中,处理大量的二进制文件是一项常见的任务,特别是在系统管理和软件开发中。本案例中,我们需要处理的是名为"HDCPkey"的二进制文件系列,具体操作是计算每个文件前320个字节的十六进制和,然后将这个...
**jtool二进制文件分析工具详解** 在IT领域,特别是软件开发和系统分析中,对二进制文件的理解和分析至关重要。jtool就是这样一款专为Java开发者设计的二进制文件分析工具,它能够帮助用户深入理解Java字节码,进行...
描述中提到的“查找二进制文件中,自己的一个二进制串的地址”是一项常见的操作,特别是在软件开发、逆向工程和数据分析中。 首先,理解二进制文件:计算机中的所有程序和数据最终都会被转化为二进制形式存储和处理...
在Linux操作系统中,读取文件并输出其16进制内容是常见的操作,尤其是在进行二进制分析或数据处理时。这个任务可以通过使用各种命令行工具或者编写简单的C程序来实现。下面我们将详细探讨如何在Linux环境下实现这一...
总的来说,Python Pigaios是二进制文件处理领域的一个强大工具,它弥补了Python标准库在处理二进制差异分析方面的空白,为开发者提供了一种灵活且高效的方法来解决这类问题。无论是用于软件开发、数据分析还是自动化...
二进制文件比较工具是一种非常实用的软件工具,主要用于检测两个文件之间内容的差异,无论是文本文件还是二进制文件。这种工具对于软件开发者、系统管理员以及数据分析师来说尤其重要,因为它们能快速定位和识别文件...
### Windbg分析dump及Linux调试程序使用方案 #### Windows下的Windbg分析dump及调试程序 **Windbg**是Microsoft提供的一款强大的调试工具,主要用于Windows环境下应用程序的调试与故障诊断。它支持用户模式和内核...
- 将二进制文件以文本模式读取,同样显示每个字符及其ASCII码。 #### 四、总结 通过以上代码示例,我们可以清楚地看到文本模式与二进制模式之间的主要区别: - 在文本模式下,换行符会被特殊处理(如转换为`\r\n`...
### Python二进制文件读取并转换为浮点数详解 在进行数据分析或科学计算时,经常需要处理存储为二...通过上述步骤,可以有效地从二进制文件中读取并转换数据为浮点数数组,为后续的数据分析和科学计算打下坚实的基础。
优秀的文件比较工具不仅要能处理文本文件,还应具备处理二进制文件的能力。Araxis Merge在这方面表现出色,无论是图片、音频文件还是程序库,它都能准确识别差异。 5. 版本控制系统集成: 对于开发人员来说,文件...
pit hook技术是防御二进制漏洞的一种方法,它在函数调用时插入假函数,通过修改.pit.got节的目标地址,绕过常规的runtime_resolve()函数,直接执行预定的代码,破坏攻击者利用漏洞的条件。文章详细描述了ELF...
彻底保护您的Class二进制文件,任何通过分析Class文件结构来实现反编译的工具均不能对加密后的文件反编译。 <br> 使用方法 在要分发您的Java应用程序前,使用JavaClass文件加密专家对所有的Class文件或Jar...
总结来说,fuzz-hardening是一种用于提升二进制文件安全性的技术,它通过自动化的方法优化代码,使之在面对模糊测试时更加健壮,从而降低被攻击的风险。这一技术结合了静态分析、代码变异、反馈学习等手段,为软件...
静态分析是在不运行代码的情况下检查源代码或编译后的二进制文件,而动态分析则是在程序运行时监测其行为。模糊测试则是通过生成大量随机输入来触发潜在的异常行为,以找出可能的漏洞。 此外,文献可能还会涉及漏洞...
在处理二进制文件时,通常会使用二进制模式打开文件,以便逐字节读取。例如在Python中,可以使用`open()`函数的'rb'模式打开文件,然后使用`read()`或`readline()`方法逐字节读取。对于每个字节(8位),可以通过位...