如何删除 ELF 文件中的节头表?

coo*_*der 2 linux reverse-engineering elf

我是 ELF 二进制保护的新手。

我想删除节头表以避免调试。

我尝试通过运行 readelf -h 来查找磁盘上的节头表偏移量,并尝试 nop 它们,但它们都是 0。

如何删除节标题表?

提前致谢。

Ran*_*Guy 5

首先,您可以使用 来检查您的精灵中存在哪些部分readelf --section-headers。你应该看到这样的东西:

$ readelf --section-headers <your-file>

[ #] Name               Type            Address            Offset
     Size              Size.Ent         Flags     -     -  Alignment
[ 0]                   NULL             0000000000000000  00000000
     0000000000000000  0000000000000000           0     0     0
[ 1] .data             PROGBITS         00000000006000b0  000000b0
     000000000000003b  0000000000000000  WA       0     0     1
[ 2] .text             PROGBITS         0000000000a000f0  000000f0
     00000000000003e9  0000000000000000  AX       0     0     1
[ 3] .shstrtab         STRTAB           0000000000000000  000004d9
     0000000000000027  0000000000000000           0     0     1
[ 4] .symtab           SYMTAB           0000000000000000  00000680
     0000000000000438  0000000000000018           5    41     8
[ 5] .strtab           STRTAB           0000000000000000  00000ab8
     0000000000000258  0000000000000000           0     0     1
Run Code Online (Sandbox Code Playgroud)

您应该知道,大多数部分都是由链接器添加的,因为您的二进制文件中唯一需要的实际部分是.text.data。如果您手动进行链接,则可以省略大多数其他信息。

如果您使用经典ld链接器,我建议尝试 options--strip-all--strip-debug. 顾名思义,它们从二进制文件中删除调试信息和其他符号信息 -在这里您可以看到文档。

$ readelf --section-headers <your-file>

[ #] Name               Type            Address            Offset
     Size              Size.Ent         Flags     -     -  Alignment
[ 0]                   NULL             0000000000000000  00000000
     0000000000000000  0000000000000000           0     0     0
[ 1] .data             PROGBITS         00000000006000b0  000000b0
     000000000000003b  0000000000000000  WA       0     0     1
[ 2] .text             PROGBITS         0000000000a000f0  000000f0
     00000000000003e9  0000000000000000  AX       0     0     1
[ 3] .shstrtab         STRTAB           0000000000000000  000004d9
     0000000000000017  0000000000000000           0     0     1
Run Code Online (Sandbox Code Playgroud)

但现在你可能应该只有 3 个部分,并且由于大部分数据已经被省略,你可以在那时停止 - 现在你.shstrtab只包含文本和数据部分的名称 - 这并不是真正的秘密:)

现在这真的取决于你准备走多远。

如果您想继续,我建议尝试另一个名为strip(来自 binutils)的工具,您可以像这样使用它:strip --remove-section=shstrtab <your-file>- 它基本上删除了不需要的部分,但它并不那么容易摆脱,.shstrtab因为我记得使用它。

您甚至可以尝试自己删除它 - 因为您知道节的确切偏移量(并且它可能位于文件的最末尾),所以您可以将零放在它上面,即“重命名”节为 null :)

根据 ELF 规范,执行不需要 shstrtab,所以即使您手动从文件中删除它(删除那些字节),您也应该没问题 - 只需保持其他指针、偏移量等有效


就我而言,删除调试信息是可以的,所以我没有走那么远,但你可以 - 我只是祝你好运:)