【问题标题】:Extract a string variable from elf/obj file从 elf/obj 文件中提取字符串变量
【发布时间】:2017-12-27 11:09:51
【问题描述】:

我正在尝试从 Linux 程序的 elf 文件,甚至是它来自的 .o 文件中提取特定的字符串变量(即符号)。 它在 .rodata 部分,显然我知道符号名称。 是否有一系列 objdump 样式的命令和选项可以用来转储字符串?

更新:

例如,.map 文件包括:

.rodata.default_environment 0x000000001013f763 0x615 common/built-in.o
                            0x000000001013f763    default_environment

变量本身 - default_environment - 是一个标准的以空值结尾的文本字符串。

【问题讨论】:

  • 您能否说明值在目标文件或源代码级别中的表示方式?正确的方法取决于此。
  • 嗨,不确定显示它的最佳方式,但是,例如,.map 文件包括: .rodata.default_environment 0x000000001013f763 0x615 common/built-in.o 0x000000001013f763 default_environment 变量本身 - “default_environment " - 是标准的以空值结尾的文本字符串。 [抱歉 - 不明白如何简单地将文本粘贴到此处的回复中!]
  • 您可以编辑您的帖子以包含此信息。了解default_environment 的源代码是什么样子也很有趣——它是一个数组还是一个指针。
  • const uchar default_environment[] = { "some text" };

标签: elf binutils


【解决方案1】:

是否有一系列 objdump 样式的命令和选项可以用来转储字符串?

当然。让我们构造一个例子:

const char foo[] = "Some text";
const char bar[] = "Other text";

const void *fn1() { return foo; }
const void *fn2() { return bar; }

$ gcc -c t.c

假设我们要提取bar[]的内容。

$ readelf -Ws t.o | grep bar
    10: 000000000000000a    11 OBJECT  GLOBAL DEFAULT    5 bar

这告诉我们bar 变量的“内容”位于第 5 节,偏移量为0xa,长度为 11 个字节。

我们可以提取整个第 5 节:

$ readelf -x5 t.o

Hex dump of section '.rodata':
  0x00000000 536f6d65 20746578 74004f74 68657220 Some text.Other 
  0x00000010 74657874 00                         text.

确实找到了我们正在寻找的字符串。如果您真的只想提取 bar 的内容(例如,因为 .rodata 非常大,和/或因为 bar 包含嵌入的 NULs):

$ objcopy -j.rodata -O binary t.o t.rodata    # extract just .rodata section
$ dd if=t.rodata of=bar bs=1 skip=10 count=11 # extract just bar

11+0 records in
11+0 records out
11 bytes (11 B) copied, 0.000214501 s, 51.3 kB/s

看结果:

$ xd bar
000000   O   t   h   e   r       t   e   x   t nul                              O t h e r   t e x t . 

QED。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2017-11-01
    • 2022-01-06
    • 2019-07-22
    • 2013-08-28
    • 2020-12-27
    相关资源
    最近更新 更多