什么是精灵魔法?

Mit*_*tch 29 elf

我之前看过关于 ELF 魔法的讨论,最近是在这个安全堆栈交换问题中的评论。我之前已经看到它提到过,我在我自己的引导日志中也看到过它。但我不确定它是什么。

elf 上的手册页有点超出我的理解,因为我不使用 C 或更低级别的语言。

作为使用 Linux 作为日常操作系统的人,ELF 是什么?

cas*_*sey 42

直接从您引用的手册页:

elf - format of Executable and Linking Format (ELF) files
Run Code Online (Sandbox Code Playgroud)

ELF 定义了 Linux 使用的可执行文件的二进制格式。当你调用一个可执行文件时,操作系统必须知道如何将可执行文件正确加载到内存中,如何解析动态库依赖关系,然后从哪里跳转到加载的可执行文件以开始执行它。ELF 格式提供此信息。ELF 魔法用于识别 ELF 文件,它只是文件的前几个字节:

% od -c -N 16 /bin/ls
0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020
Run Code Online (Sandbox Code Playgroud)

或者

% readelf -h /bin/ls | grep Magic
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
Run Code Online (Sandbox Code Playgroud)

这 16 个字节明确地将文件标识为 ELF 可执行文件。许多文件格式都有“魔法”字节来完成相同的任务——识别文件类型。

  • 实际的魔法只是前四个字节。以下字段描述了字节序、CPU 架构和其他各种内容。 (8认同)
  • 如果你想要真正的技术,前 16 个字节是“标识”(`e_ident`),其中前 4 个字节是幻数(`EI_MAG0` 到 `EI_MAG3`) (2认同)
  • “毫不含糊”有点夸大其词。除非您知道文件来自哪里,否则任何事情都只是猜测。`/bin` 中的文件,当然,它几乎肯定是一个 ELF 二进制文件。你下载了一些随机文件,但是......没有告诉。 (2认同)

小智 14

“幻数”是文件开头的常量字节序列(通常)的名称,用于将这些文件标记为特定文件格式。它们的用途与文件扩展名相似。

有关更多信息,请参阅行话文件条目

例如,PNG 图像始终以相同的八个字节开头:137 80 78 71 13 10 26 10

因此,ELF 幻数是 elf 文件开头的字节,用于标识它们。