关于ELF Header Strip的问题

一个比较古老的问题,之前做angr的时候遇到过类似情况

当执行的qemu-mips架构与实际程序不同时,会有错误提示

执行程序前必须先查看下程序的架构

使用file命令,其中提到corrupted section header size

使用readelf -h查看文件elf header

确认是mips32小端序,并且corrupted指的就是section headers段为空

可能是在编译的过程中将此段删除掉或隐掉了,比如使用sstrip工具等

确定了架构,就可以选择复制符合此程序架构的qemu-mips

在比较早的qemu版本时,选择相同的架构执行时依然会报错,原因在于elfload.c源码中有对elf section header size部分的处理

搜索 qemu/linux-user/elfload.c

在早期版本中,函数elf_check_ehdr()代码逻辑中存在elf_shdr的size比较,在目前的代码中,这一行已经被删除掉

/* Verify the portions of EHDR outside of E_IDENT for the target.
   This has to wait until after bswapping the header.  */
static bool elf_check_ehdr(struct elfhdr *ehdr)
{
    return (elf_check_arch(ehdr->e_machine)
            && ehdr->e_ehsize == sizeof(struct elfhdr)
            && ehdr->e_phentsize == sizeof(struct elf_phdr)
            //&& ehdr->e_shentsize == sizeof(struct elf_shdr)
            && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));
}

参考资料

https://github.com/angr/cle/issues/146

您可能还喜欢...