【问题标题】:How do I strip section header table in an ELF file?如何剥离 ELF 文件中的节标题表?
【发布时间】:2020-09-27 00:32:49
【问题描述】:

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

我想剥离节头表以避免调试。

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

如何剥离节标题表?

提前致谢。

【问题讨论】:

    标签: linux reverse-engineering elf


    【解决方案1】:

    首先,您可以使用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
    

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

    如果您使用经典的ld 链接器,我建议您尝试选项--strip-all--strip-debug。顾名思义,他们从二进制文件中删除了调试信息和其他符号信息 - here 你可以查看文档。

    $ 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
    

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

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

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

    您甚至可以尝试自己删除它 - 因为您知道部分的确切偏移量(并且它可能在文件的最后),您可以在它上面放置零,也就是将部分“重命名”为 null :)

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


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

    【讨论】:

      【解决方案2】:

      您可以下载 Upx 打包程序。然后,当你运行 objdump -fs 时,你会有一些链接:

      ransom:     file format elf64-x86-64
      architecture: i386:x86-64, flags 0x00000140:
      DYNAMIC, D_PAGED
      start address 0x0000000000003190
      

      没有别的。

      【讨论】:

        猜你喜欢
        • 2011-06-09
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多