不同 C 编译器生成的可执行文件的差异

Differences in executables produced by different C compilers

如果要尝试利用二进制文件,如果可执行文件是由特定的编译器和链接器生成的,是否会有所不同?

我会详细说明问题。我试图了解 windows 剥削的工作原理。我有一个用 C 编写的源代码文件。我可以使用 Microsoft 的 'cl' 编译器或 GNU gcc 编译器。这两者是否会产生相同的可执行文件,因此两者都可以以相同的方式被利用,或者可执行文件会不同,随后的利用也会不同?如果它们不同,我应该考虑哪些差异?

If one were to try to exploit a binary file, would it make a difference if the executable is produced by a specific compiler and linker?

一般来说,是的。二进制程序的利用通常取决于程序中机器指令的确切内存布局和顺序。当使用不同的编译器构建程序时,这会有所不同 - 或者甚至,正如 David C. Rankin 指出的那样,具有不同选项的相同编译器。

Would both of these produce the same executable so both can be exploited the same way OR the executable would be different and subsequently the exploitation would be different?

它们通常会有所不同。如果幸运的话,某些类型的漏洞利用可能对两者都起作用,但这取决于漏洞利用的具体作用。例如,可能会发生:

  • 相同的漏洞利用无需更改即可用于新版本

  • 相同的基本攻击有效,但由于内存布局不同,必须更改地址

  • 利用仍然是可能的,但需要完全不同的技术

  • 此漏洞不再可能,无论是巧合还是此编译器实施的有意反制措施(堆栈保护、地址随机化等)。

If they are different, what are the differences that I should take into account?

范围太广,无法回答。通常,您可能必须完全从头开始分析由第二个编译器构建的程序的行为,以确定它是否仍然可利用,如果是,如何实现。