可执行文件和数据文件格式之间的区别?

可执行文件和数据文件格式之间的区别?

我简单说几句,因为我知道这类问题通常带有恶意。

  • 我并没有尝试执行文件格式 (jpg) 中的某些操作
  • 我并不是想简单地实现最终目标(即让某些东西看起来像 jpg 但执行)
  • 我只是想了解计算机解析信息的方式之间的区别

因此,据我所知,处理数据文件格式(例如 JPG、PDF 等)的计算机只会解析本质上是遵循特定布局/规范的容器中的信息。通常,您听到的数据文件格式和可执行文件之间的区别在于计算机不会“运行(执行)”数据文件。我的问题是 - 计算机如何知道要读取什么以及要执行什么?有什么区别?我对计算机的印象是它一步一步地读取指令。如果在解析 jpg 的过程中它看到了弹出消息框的 shellcode,为什么它在读取时不激活?

我知道可以通过软件漏洞来执行某些操作,欺骗解析器 - 可能是通过缓冲区溢出等。同样,我对如何实现最终目标并不感兴趣。我更感兴趣的是计算机如何分辨什么是要读取的,什么是要执行的,以及如何在不执行的情况下实现读取。

答案1

嗯,数据文件由程序打开。程序/可执行文件本身会打开这些文件并解释数据。

可执行文件,由操作系统为 CPU 打开/运行。它们包含指令,即 CPU 的数据。

如果数据文件包含 CPU 指令,通常不会发送到 CPU,因为它只是程序正在读取的文件,因此最多可以包含程序指令。但如果程序出现问题,例如数据文件导致程序缓冲区溢出,那么我认为数据文件中的内容可能会发送到 CPU。

可以将 jpg 文件重命名为 exe 并执行它,它将由 CPU 运行并给出错误,除非它里面真的有机器代码(CPU 指令),否则它实际上是一个扩展名错误的可执行文件,现在具有正确的扩展名。

答案2

在 Windows 上,只有扩展名才能使文件可执行 - 具体来说,EXE 将执行,而某些其他格式将由cmd或 PowerShell 解释。

在类 Unix 系统中,有一个执行位。如果您熟悉 Windows 文件属性的概念,那么您可以将其视为一种属性。任何文件都可以设置执行位 - 可以执行它(作为程序、脚本等)。否则,操作系统将始终将其视为无法执行的常规文件。

类 Unix 操作系统不使用文件扩展名的概念,而是尝试通过文件内容来识别文件。通常,文件的前几个字节组成一个神奇数字- 唯一的文件类型标识符(参见维基百科文章

相关内容