放置在ELF中写入国外数据

问题描述 投票:0回答:2

我正在尝试创建一个程序来监控自己的校验和。为此,我试图找到一个可以将校验和放入二进制文件的地方。在检查了布局并检查了一些已编译的可执行文件之后,其中有几个:

  • 一些标题内的填充字段。这些在加载时被跳过,但我犹豫要不要使用它们,因为它们是保留的;
  • SHT_NULL 节头的一些字段。如果未使用此标头,我可以将校验和放入其字段之一。问题是 - 我不确定加载时它是否被使用或未使用。而且我不确定它是否总是存在于编译的二进制文件中;
  • 创建一些全局数组,用它找到.data 部分并在此处写入校验和。现在我不确定是否可以通过查看二进制文件找到指向数组开头的指针;
  • 将我的数据放在文件末尾。可能是最简单的,但我真的不想改变二进制文件的大小。

前三个地方之一可以用于我的目的吗?我的意思是,理论上,我可以在任何地方写入数据,但这些地方够用吗?也许我在二进制文件中遗漏了一些其他可能的地方。或者我应该退回到只在文件末尾写入校验和?

linux elf
2个回答
1
投票

创建一些全局数组,用它找到.data 部分并在此处写入校验和。现在我不确定是否可以通过查看二进制文件找到指向数组开头的指针;

这很简单,只是不要放入 .data 部分,创建你自己的部分。

$ cat file.c
#include <stdio.h>
__attribute__((__section__("_mydata"),__used__)) volatile char mydata[1024];
int main() {
        printf("%s\n", mydata);
}
$ gcc file.c
$ objcopy --update-section _mydata=<(echo -n 'hello') ./a.out && ./a.out
hello
$ objcopy --update-section _mydata=<(echo -n 'world') ./a.out && ./a.out
world

1
投票

除此之外的所有方法:

创建一些全局数组,用它找到 .data 部分并在此处写入校验和。

调用某种未定义的行为。这些方法可能看起来有效,直到它们不起作用。

我不确定是否可以通过查看二进制文件找到指向数组开头的指针

在未剥离的二进制文件中找到该数组的位置绝对是easy——阅读符号表,找到你的符号的名称,它的地址将就在那里

您还可以使用

__attribute__((section(...)))
将该数组放置在单独的部分中,即使符号被剥离,也可以从部分标题中找到该部分。

也就是说:

  1. 改变
    .data
    内容将改变校验和(除非你也从校验和计算中排除数组)和
  2. 您可能正在尝试实施某种复制保护,在这种情况下,您的努力可能是徒劳的
© www.soinside.com 2019 - 2024. All rights reserved.