如何去除 ELF 文件中的 header table 部分?
How do I strip section header table in an ELF file?
我是 ELF 二进制保护的新手。
我想删除部分 header table 以避免调试。
我试图通过 运行 readelf -h 在磁盘上找到 header table 偏移量的部分,并尝试对它们进行 nop,但它们都是 0。
如何删除部分 header table?
提前致谢。
首先,您可以使用 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 <your-file>
- 它基本上删除了不需要的部分,但它不是很容易摆脱 .shstrtab
因为我记得使用它。
您甚至可以尝试自己删除它 - 因为您知道部分的确切偏移量(并且它可能在文件的最后),您可以将零放在它上面,也就是 "renaming" 部分到 null : )
并且根据 ELF 规范,执行不需要 shstrtab,因此即使您手动将其从文件中删除(删除那些字节)也应该没问题 - 只需保持其他指针、偏移量等有效
在我的例子中,删除调试信息没问题,所以我没有走那么远,但你可以 - 我只是祝你好运:)
您可以下载Upx打包器。然后,当你 运行 objdump -fs
你会得到一些东西 link 这个 :
ransom: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000140:
DYNAMIC, D_PAGED
start address 0x0000000000003190
没有别的。
我是 ELF 二进制保护的新手。
我想删除部分 header table 以避免调试。
我试图通过 运行 readelf -h 在磁盘上找到 header table 偏移量的部分,并尝试对它们进行 nop,但它们都是 0。
如何删除部分 header table?
提前致谢。
首先,您可以使用 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 <your-file>
- 它基本上删除了不需要的部分,但它不是很容易摆脱 .shstrtab
因为我记得使用它。
您甚至可以尝试自己删除它 - 因为您知道部分的确切偏移量(并且它可能在文件的最后),您可以将零放在它上面,也就是 "renaming" 部分到 null : )
并且根据 ELF 规范,执行不需要 shstrtab,因此即使您手动将其从文件中删除(删除那些字节)也应该没问题 - 只需保持其他指针、偏移量等有效
在我的例子中,删除调试信息没问题,所以我没有走那么远,但你可以 - 我只是祝你好运:)
您可以下载Upx打包器。然后,当你 运行 objdump -fs
你会得到一些东西 link 这个 :
ransom: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000140:
DYNAMIC, D_PAGED
start address 0x0000000000003190
没有别的。