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

时间:2017-07-21 11:52:39

标签: elf binutils

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

更新

例如,.map文件包含:

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

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

1 个答案:

答案 0 :(得分:4)

  

是否有一系列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 s):

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