【问题标题】:Find where 32-bit ELF Linux binary ends, and padding begins?查找 32 位 ELF Linux 二进制文件的结束位置和填充的开始位置?
【发布时间】:2015-01-21 00:39:39
【问题描述】:
如何确定 32 位 ELF Linux 二进制文件的结束位置以及附加到文件的附加数据的开始位置?例如,某些软件会将数据附加到文件的末尾以进行提取或执行,同时包含在单个二进制文件中。自解压档案就是此类文件的一个示例。
我想要做的与Find out where PE file ends through PE header? 要求的类似,除了 Linux ELF 二进制文件,而不是 Windows PE 二进制文件。
请注意,在我的例子中,最后没有页脚或任何其他数据来指定有效负载的大小。此类数据在有效负载开始之前指定 ELF 文件结束的位置,但我想知道如何以编程方式找到它而不寻找它并希望它不会得到误报。
【问题讨论】:
标签:
linux
format
executable
reverse-engineering
elf
【解决方案1】:
也许您可以获取节标题表的位置并根据条目数量和条目大小对其进行计时?不完全确定,但这是我最好的选择。
【讨论】:
-
我正在对 ELF 格式进行更多研究,这实际上是正确的!这是公式:e_shoff + (e_shentsize * e_shnum)Format spec。
【解决方案2】:
答案因 ELF 标头的布局而异。使用或不使用调试符号编译的二进制文件和完全剥离的二进制文件可能具有不同顺序的部分。有时最后一个 ELF 条目是文件头,有时是其他部分,例如.symtab 部分,稍后出现在文件中。
uint32_t size;
Elf<size>_Ehrd* header = ...;
Elf<size>_Shdr* last_header = ...; // get the section with the highest offset
if(last_header->sh_offset < header->e_shoff)
size = header->e_shoff + header->e_shnum * header->e_shentsize;
else
size = last_section->sh_offset + last_section->sh_size;
在某些情况下,您实际上可以覆盖文件头之后出现的部分,并且程序仍然会运行。如果您不截断文件,则执行 strip 仍然有效。但是readelf 可以索引到已被覆盖的部分或报告文件已被截断。
在计算中比较实际最后一段的偏移量可以保持整个二进制文件的完整性,而不仅仅是它的可运行部分。