libelf 破坏 ARM elf 二进制文件

Posted

技术标签:

【中文标题】libelf 破坏 ARM elf 二进制文件【英文标题】:libelf corrupts ARM elf binaries 【发布时间】:2016-03-11 20:32:13 【问题描述】:

我正在尝试使用 libelf 库在 linux 上操作 ARM elf 二进制文件,但没有成功。即使是最小的测试用例也会损坏我的二进制文件,我不知道为什么。

这是我的最小测试代码,它读取一个 elf 文件,然后简单地将其写回:

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h> 
#include <unistd.h>  
#include <libelf.h>
#include <assert.h>

void main (void)

    if (elf_version(EV_CURRENT) == EV_NONE)
       return;

    int fd = open ("HelloWorld.elf", O_RDWR);
    assert (fd);

    Elf *e = elf_begin(fd, ELF_C_RDWR, (Elf *) 0);
    assert (e);

    if (elf_update(e, ELF_C_WRITE) == -1)
        return;

    elf_end (e);
    close (fd);

    printf ("ok\n");
    return;

如果我在 ELF 64 位 x86-64 可执行文件上运行此代码,我会得到 elf 文件的位精确副本。这正是我所期望的。

但是,如果我传入 ARM 32 位可执行文件,则文件会损坏。它仍然是一个 elf 文件,我可以很好地解析它,但是部分偏移量已被修改并且更糟:部分到段映射被破坏:

在运行我的代码之前,映射如下所示:

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx 
   01     .text .ARM.exidx 
   02     .data .bss 

运行我的代码后,它变成:

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .ARM.exidx .heap .stack_dummy .ARM.attributes .comment .svc_table 
   02     .bss 

如果我使用 objcopy 将修改后的 elf 二进制文件转换为 flash 图像,我只会得到垃圾。

那么我应该做些什么来使 libelf 库与 arm 二进制文件一起工作?

背景:

我正在编写一个小实用程序来计算一些校验和并将它们插入到 elf 二进制文件中。这是我的微控制器所必需的,不幸的是 gnu LD 不能靠它自己做。我认为使用高级 ELF 操作库将是实现此功能的最佳和最强大的方法。

【问题讨论】:

【参考方案1】:

自己找到的。

打开elf文件后调用:

elf_flagelf (e, ELF_C_SET, ELF_F_LAYOUT);

将告诉 libelf 不要触及段和部分布局。这可以防止 libelf 重写可执行文件,我们将得到一个未修改的文件作为 exepcted。

在对节数据进行任何修改后,需要像这样调用 elf_flagdata:

 Elf_Data *data = elf_getdata ( ...

 // do modification to data here..

 elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);

需要让 libelf 知道数据已更改并且必须重新计算 elf 校验和。

【讨论】:

我自己也发现了这个......但我不明白为什么必须指定 ELF_F_LAYOUT 标志,我想知道 elf_flagelf(elf, ELF_C_SET, ELF_F_DI​​RTY) 是否会一切都会重新计算。

以上是关于libelf 破坏 ARM elf 二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

将整个ELF二进制文件转储为可读的标题和部分

ld链接时巨大的二进制大小

二进制安全:ELF文件深度分析Linux二进制代码审计

Android 逆向ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )

Android 逆向ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )

gcc 是不是有任何选项可以在 ELF 二进制文件中添加版本信息?