在构建 ELF 二进制文件后添加一些字符串

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

有什么方法可以设置一个 ELF 可执行文件,这样我就可以在“构建”它之后向其中添加一个键和值的小表,并在可执行文件内的程序时访问这些键和值正在运行?

我的用例是这样的:我正在部署一个程序以及一些秘密。我正在部署的环境没有互联网连接,因此它无法从任何地方提取机密。我喜欢部署和运行单个可执行文件的简单性。我想避免引入需要相互指向的多个文件。但另一方面,我不想将我的秘密暴露给我的开发或构建环境。我想做的是按照正常方式构建可执行文件,然后在部署时为可执行文件注入秘密,最好将它们写入可执行文件本身。

是否可以读取 ELF 二进制文件并添加新的文本部分或类似的内容?然后,当可执行文件中的程序运行时,我是否可以获取指向具有特定名称的部分的指针,以允许我处理该部分不存在的情况?

这个答案是关于 elf 二进制文件和链接细节的绝对宝石,但在我深入那个兔子洞之前,我想知道:是否有一些更直接或更标准的方法可以在它之后向 ELF 可执行文件添加一些字符串已经建成了吗?

elf
1个回答
0
投票

并在可执行文件内的程序运行时访问这些键和值

实现这一目标似乎微不足道:

#include <stdio.h>

struct KV {
  char key[40];
  int val;
} kv[100] = {"", 42};

int main()
{
  for (struct KV *p = &kv[0]; p->key[0] != '\0'; ++p) {
    printf("key: %s, value: %d\n", p->key, p->val);
  }
  return 0;
}

这个程序不会打印任何东西(第一个

key
是空的),直到你“灌输”你的秘密。

查找

kv[]
的开始位置很简单——只需使用
nm a.out
readelf -WS a.out
(找出
.data
的文件偏移量)。一旦您知道文件偏移量,请用您的秘密覆盖那里的数据,然后瞧。

附注您也可以使用

gdb --write ./a.out
进行此操作以进行演示。

./a.out
# no output as expected

gdb -q --write ./a.out
Reading symbols from ./a.out...

(gdb) p &kv[0]
$1 = (struct KV *) 0x404040 <kv>
(gdb) set var $1.key = "abc"
(gdb) set var $1.val = 1001

(gdb) p &kv[1]
$2 = (struct KV *) 0x40406c <kv+44>
(gdb) set var $2.key = "cde"
(gdb) set var $2.val = 2002
(gdb) q

$ ./a.out
key: abc, value: 1001
key: cde, value: 2002
© www.soinside.com 2019 - 2024. All rights reserved.