如何在ELF文件中剥离节头表?

问题描述 投票:0回答:1

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

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

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

我怎样才能剥离节头表?

先谢谢你。

linux reverse-engineering elf
1个回答
0
投票

首先,你可以用以下方法检查你的elf中存在哪些节。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. 顾名思义,它们从二进制中删除了调试信息和其他符号信息--。此处 你可以看到文档。

$ 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 <your-file> - 它基本上可以删除不需要的部分,但它并不是那么容易删除的 .shstrtab 因为我记得使用它。

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

根据ELF的规范,shstrtab不是执行所需的,所以即使你手动从文件中删除它(删除这些字节)也应该是OK的--只要保持其他指针、偏移量等有效就可以了


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

© www.soinside.com 2019 - 2024. All rights reserved.