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

Mys*_*tor 10 strip executable elf

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

有没有理由不通过条带去除这些?是否有另一个实用程序可以删除可执行文件运行不需要的所有内容?我已经尝试手动编辑我正在制作的代码高尔夫可执行文件以删除部分标题,它似乎工作正常,并且要小得多。

Tho*_*key 5

GNU binutilsstrip 的文档暗示了原因,但并不明确,在描述中--only-keep-debug提到

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

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

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

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

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

《学习 Linux 二进制分析》中,这一点得到了重申,并评论说,节头通常只有在有人故意删除时才会丢失,而没有节头,gdb几乎objdump毫无用处。