为什么 `strip` 不从 ELF 可执行文件中删除节头?

为什么 `strip` 不从 ELF 可执行文件中删除节头?

最小的 ELF 可执行文件仅需要 ELF 标头和至少一个程序标头才能发挥作用。然而,当我在一个短可执行文件上运行 strip 时,它决定不丢弃节头表或节字符串节,保留它们,尽管它们对于程序的执行没有任何目的(据我所知)。

是否有原因导致这些不被剥离删除?是否有另一个实用程序可以删除可执行文件运行不需要的所有内容?我尝试手动编辑我正在制作的代码高尔夫可执行文件以删除节标题,它似乎工作正常,而且要小得多。

答案1

的文档GNU binutilsstrip 暗示原因,但没有明确说明,在描述中--only-keep-debug提到

注意 - 被剥离部分的节标题被保留,包括它们的大小,但该部分的内容被丢弃。保留节头,以便其他工具可以将 debuginfo 文件与真正的可执行文件进行匹配,即使该可执行文件已重新定位到不同的地址空间。

也就是说,除非通过-R选项明确告知,否则strip将保留节标题以帮助其他程序(包括gdb)完成其工作。

这一页strip命令的正确使用(部分使用 Linux 操作系统进行逆向工程) 注释

在可执行文件上运行strip命令是最常见的程序保护方法。在默认操作中,该strip命令从可执行文件中删除符号表和任何调试信息。这就是它的典型使用方式。然而,仍然有一些有用的信息没有被删除。

并继续列举了一些可能留下的有用的东西 - 用于分析“剥离”的可执行文件。

学习 Linux 二进制分析,这被重申,评论说节标题通常只有在有人拥有时才会丢失故意地删除它们,并且没有节标题,gdb并且objdump几乎没有用。

相关内容