从elf/obj文件中提取字符串变量

5
我正在尝试从Linux程序的elf文件中提取特定的字符串变量(即符号),甚至可以从它来自的.o文件中提取。 它在.rodata部分中,我知道符号名称。 有没有一系列的objdump风格的命令和选项,我可以使用它们来转储字符串? 更新: 例如,.map文件包括:
.rodata.default_environment 0x000000001013f763 0x615 common/built-in.o
                            0x000000001013f763    default_environment

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

你能展示一下该数值在目标文件或源代码级别是如何表示的吗?合适的方法取决于此。 - Florian Weimer
您好,不确定最佳展示方式,但例如,.map文件包括: .rodata.default_environment 0x000000001013f763 0x615 common/built-in.o 0x000000001013f763 default_environment变量本身 - "default_environment" - 是一个标准的空终止文本字符串。[抱歉 - 不知道如何将文本简单粘贴到这里的回复中!] - ColH
请提供“default_environment”函数的源代码,以便了解它是数组还是指针。 - Florian Weimer
const uchar default_environment[] = { "一些文本" }; - ColH
1个回答

7

有没有一系列的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包含嵌入式NUL):

$ 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 . 

证毕。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接