据我所知,/bin
我们有一些二进制可执行文件,它们只是编译后的 C 程序。出于好奇,我决定玩弄它们,我使用ls
以sudo
特权打开nano
,并在开头添加了字符0
。我保存了文件,令我感到好笑的是,我检查发现,ls
在终端中执行命令确实不起作用。
没想到的是,删除这个我添加的字符之后,命令ls
仍然不起作用,并且出现段错误。
如果文件中包含的/bin
只是由 1 和 0 组成的机器代码,为什么删除我们之前添加的字符却无法使程序正常运行?
据我所知,/bin
我们有一些二进制可执行文件,它们只是编译后的 C 程序。出于好奇,我决定玩弄它们,我使用ls
以sudo
特权打开nano
,并在开头添加了字符0
。我保存了文件,令我感到好笑的是,我检查发现,ls
在终端中执行命令确实不起作用。
没想到的是,删除这个我添加的字符之后,命令ls
仍然不起作用,并且出现段错误。
如果文件中包含的/bin
只是由 1 和 0 组成的机器代码,为什么删除我们之前添加的字符却无法使程序正常运行?
使用文本编辑器编辑二进制文件可能有效,也可能无效 - 实践中通常无效。编辑器可能会进行各种更改,如修复行尾(例如,如果文件中的字节序列包含
\r\n
,编辑器可能会将其“修复”为\n
,或将出现的 修复为\n
) ,如果文件未以换行符结尾,则添加尾随换行符,等等。二进制文件\r\n
很可能确实ls
因某些此类更改而损坏。您可以比较原始文件和修改后文件的输出,以查看具体更改了什么。并考虑在将来使用十六进制编辑器(请推荐用于 shell 的十六进制编辑器)来编辑非文本文件。od -c
hexdump
重复您的实验,然后与原始使用进行比较,
binwalk
表明原因确实是0x0D
(CR) 到0x0A
(LF) 字符的转换:其中一个字节可能是内存地址的一部分或创建地址所涉及的指令。无效的内存地址会导致分段错误。
当你打开该文件时,nano 会将其告知为
(Converted from Mac format)
。您可以通过提供命令行选项来禁用此转换和添加尾随换行符
nano -LN
。使用这些选项,结果与原始结果相同,但以这种方式编辑二进制文件仍然容易出现损坏。