在Linux上凝视二进制文件

下面是8条Linux命令,用于查看二进制文件和查看可执行文件运行时的详细信息。

分析/检查/检查/发现/研究/放大镜
Thinkstock.

Linux系统上不是文本文件的任何文件都被视为二进制文件 - 从系统命令和库到图像文件和编译程序。但是这些文件是二进制文件并不意味着您无法调查它们。实际上,有很多命令可以用来从二进制文件中提取数据或显示其内容。在这篇文章中,我们将探讨它们中的相当多。

文件

从二进制文件中提取信息的最简单命令之一是文件按类型识别文件的命令。它通过几种方式实现这一点——通过计算内容、寻找“魔术数字”(文件类型标识符)和检查语言。虽然我们人类通常通过文件扩展名来判断一个文件,但是文件命令很大程度上忽略了这一点。请注意,它如何响应下面显示的命令。

$ file camper.png camper.jpg:JPEG图像数据,JFIF标准1.01分辨率(DPI),
密度72x72,段长16,EXIF标准:[TIFF图像数据,
Little-Endian,Direntries = 11,制造商=三星,型号= SM-G935V,
方向=左上,Xresolution = 164,Yresolution = 172,
解决方法= 2,软件= GIMP 2.8.18,DATETIME = 2018:04:30 07:56:54,
,渐进式,精度8,3465x2717,组件3

文件命令很容易确定"camper.png"实际上是一个JPG文件,但在本例中,它告诉我们更多。这包括图像分辨率(3465x2717),拍摄的日期和时间,以及关于图像和用于拍摄照片的手机的细节。不是所有的jpg文件都会包含所有这些数据,但是文件将向您展示可用的内容。

询问一个系统二进制,输出看起来会非常不同。

$ file /bin/date:精灵64位LSB pie可执行文件,x86-64, version 1 (SYSV),
动态链接,翻译/llib64/ld-linux-x86-64.so.2,
BuildID [sha1] = 9 ce744916618c6eef6f28ff70a3758675c307fb2, GNU / Linux
3.2.0,剥夺了

在这个例子中,我们看到日期command是一个ELF(可扩展链接格式)文件以及其他一些细节,这并不奇怪。

LDD.

LDD.命令列出可执行文件使用的共享库。的日期Command只使用少量。

$ LDD /bin/date linux-vdso.so.1(0 x00007fff21162000) libc.so。6 = > / lib64 / libc.so.6(0 x00007f2572f45000) / lib64 / ld - linux - x86 - 64. - so.2(0 x00007f2573141000)

ltrace.

ltrace.跟踪库调用可执行文件。

$ ltrace pwd getenv("POSIXLY_CORRECT") = nil strrchr("pwd", '/') = nil setlocale(LC_ALL, "") = "en_US。UTF-8" bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale" textdomain("coreutils") = "coreutils" __cxa_atexit(0x5644cb982120, 0, 0x5644cb985b20, 0x6c69747565726f63) = 0 getopt_long(1, 0x7fff17badb18, "LP", 0x5644cb985b40, nil) = -1 getcwd(nil,0) = "" puts("/home/shs"/home/shs) = 10 free(0x5644cbbdf440) =  __fpending(0x7f18d802a520, 0, 0x5644cb982120, 1) = 0 fileno(0x7f18d802a520) = 1 __freading(0x7f18d802a520, 0, 0x5644cb982120, 1) = 0

strace

strace命令跟踪系统调用,被视为非常有用的诊断,调试和教学实用程序。关于它的一个不寻常的事情是它将其输出发送到STDERR(标准错误)和被跟踪到STDOUT的命令的输出(标准OUT)。因此,如果要在文件中保存跟踪信息,请使用以下命令:

$ strace ls camp * 2> output.txt camper_10.jpg camper.jpg camper.png $ $ head -8 output.txt execve(“/ usr / bin / ls”,[“ls”,“camper_10.jpg”,“Camper.jpg“,”Camper.png“,0x7FFD7EC34F18 / * 34 vars * /)= 0 brk(null)= 0x5646e6bae000 Arch_prctl(0x3001 / * arch _ ??? * /,0x7ffcc3d514cf0)= -1 einval(无效参数)访问(“/ etc / ld.so.preload”,r_ok)= -1 enoent(没有这样的文件或目录)Openat(at_fdcwd,“/etc/ld.so.cache”,o_rdonly | o_cloexec)= 3 newfstatat(3,“”,{st_mode = s_ifreg | 0644,st_size = 61880,...},at_empty_path)= 0 mmap(null,61880,prot_read,map_private,3,0)= 0x7fb2b67a9000关闭(3)= 0

hexdump

hexdump命令在十六进制中显示二进制文件的内容。添加了-C选项,它还提供了字符转换,这样我们就可以很容易地挑选出标识文件类型的“神奇数字”——下面示例中的JFIF和ELF。

$ hexdump -C camper.jpg | head -5 00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 48 |......就是以前.....H| 00000010 00 48 0000 ff e1 38 7e 45 78 69 66 0000 49 49 |.H....8~Exif..II| 00000020 2a 00 08 000000 00 0b 00 0f 01 02 00 08 000000 |*...............| 00000030 92 000000 10 01 02 00 09 0000 9a 000000 |................| 00000040 12 01 03 00 01 000000 01 000000 1a 01 05 |................|$ hexdump -C /bin/date | head -5 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.精灵............ |00000010 03 00 3E 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00> ..... @ ......00000020 40 00 00 00 00 00 00 00 00 70 9A 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000030 00 00 00 00 00 00 00 4 00 38 00 0d 00 400 00 1F 00 1E 00 | .... 8 ...... @ ..... |00000040 06 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ........ @ ....... |

这与您将使用的输出不同od(八进制转储)命令,但显示器更容易读取。

$ od -hc camper.jpg |head -6 0000000 d8ff e0ff 1000 464a 4649 0100 0101 4800 377 330 377 340 \0 020 J F I F \0 001 001 001 \0 H 0000020 4800 0000 e1ff 7e38 7845 6669 0000 4949 \0 H \0 \0 377 341 8 ~ E x i f \0 \0 I I 0000040 002a 0008 0000 000b 010f 0002 0008 0000 * \0 \b \0 \0 \0 \v \0 017 001 002 \0 \b \0 \0 \0

字符串

字符串命令从二进制文件中拔出“字符串”(可打印字符的序列)。在下面的第一个示例中,请注意它如何在露营图像上提取捕获的细节。远远超过前12行可能不会告诉你具有图像文件的额外有用信息,因为即使它们不是这样的字节序列也可以是文本。

$ strings camper.jpg | head -12 JFIF 8~Exif samsung SM-G935V GIMP 2.8.18 2018:04:30 07:56:54 0220 0100 2018:04:29 13:23:09 2018:04:29 13:23:09 0100 ASCII

你也可以使用字符串查看可执行文件的命令。

$ strings HelloWorld | head -16 /lib64/ld-linux-x86-64.so。6 .输入__libc_start_main libc.soGLIBC_2.2.5 __gmon_start__ H=(@@ []A\A]A^A_ Hello World;*3$" GCC: (GNU) 11.0.0 20210210 (Red Hat 11.0.0-0

readelf

查看ELF文件的另一个有用命令是readelf.但是,您需要选择一个选项来确定它将为您显示什么。在下面的例子中,我们看的是头文件(-H).使用-一种如果要查看所有可用数据。

$ Greadelf -H Helloworld Elf Header:Magic:7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00级别:ELF64数据:2的补充,小endian版本:1(当前)OS / ABI:UNIX  - 系统vABI版本:0类型:EXEC(可执行文件)机器:高级微设备X86-64版本:0x1入口点地址:0x401040程序头开始:64(bytes进入文件)部分标题开始:23304(字节为文件)标志:0x0这个标题的大小:64(字节)程序标题大小:56(字节)程序标头数:13张部分标题大小:64(字节)部分标题数:31截面标题字符串表索引:30

包起来

Linux系统上有很多命令,用于从二进制文件中拉动信息。当您想要更深入地看待您运行的命令或您想了解更多信息时,它们可能会非常有帮助。

加入网络世界社区有个足球雷竞技appFacebookLinkedIn评论是最重要的主题。
相关:

版权©2021Raybet2

了解IT领导者如何建立网络防御。参加CSO的网络安全与信任未来峰会(7月20日至22日)