找到32位ELF Linux二进制文件的结尾,并开始填充?

时间:2014-11-23 04:20:21

标签: linux format executable reverse-engineering elf

如何确定32位ELF Linux二进制文件的结束位置,以及附加到文件的其他数据是否开始?例如,某些软件会将数据附加到文件的末尾以进行提取或执行,同时包含在单个二进制文件中。自解压存档就是这种文件的一个例子。

我尝试做的事情类似于Find out where PE file ends through PE header?所要求的,除了Linux ELF二进制文件,而不是Windows PE二进制文件。

请注意,在我的情况下,最后没有页脚或任何其他数据来指定有效负载的大小。 ELF文件在有效载荷开始之前结束时指定了这样的数据,但我想知道如何以编程方式找到它而不寻求它并希望它不会产生误报。

2 个答案:

答案 0 :(得分:2)

也许你可以获得节头表的位置,并将其与条目数量和条目大小计算在一起?不完全确定,但这是我最好的选择。

答案 1 :(得分:1)

答案因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可以索引已被覆盖的部分或报告该文件已被截断。

比较计算中实际的最后一个部分的偏移量使整个二进制文件保持不变,而不仅仅是它的可运行部分。