ELF 文件 - 获取字符串使用位置的函数

Man*_*uel 3 debugging execute elf

我有一个 elf 文件,我想知道是否可以获得一些有关可执行文件中使用变量(字符串)的信息。

如果我打印出 .elf 的字符串,我会发现一个有趣的字符串,我想知道它在哪个函数中使用,这是否可能?

谢谢你!

小智 5

让我们考虑以下示例:

测试.c

#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
    char *str_a = "a";
    char *str_abc = "abc";

    printf("%s\n", str_a);
    printf("%s\n", str_abc);

    exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

我们来编译一下gcc -Wall -pedantic-errors -o ~/test ~/test.c

这将生成名为test.

让我们检查一下.rodata部分:readelf -x .rodata ./test

该输出如下:

Hex dump of section '.rodata':
  0x00400610 01000200 61006162 6300              ....a.abc.
Run Code Online (Sandbox Code Playgroud)

0x00400610显示起始地址。这四个点显示在第一个字符串常量之前,因此该字符串的地址a将为0x00400614。跳过a并且空字节(分隔符)会跳过2 个字节,并且 的地址abc将为0x00400616。那么,此时,两个地址就已知了。

接下来我们来表演一下objdump -M intel -d ./test

main以下是内部部分的列表.text


    0000000000400546 <main>:
      400546:   55                      push   rbp
      400547:   48 89 e5                mov    rbp,rsp
      40054a:   48 83 ec 20             sub    rsp,0x20
      40054e:   89 7d ec                mov    DWORD PTR [rbp-0x14],edi
      400551:   48 89 75 e0             mov    QWORD PTR [rbp-0x20],rsi
      400555:   48 c7 45 f8 14 06 40    mov    QWORD PTR [rbp-0x8],0x400614
      40055c:   00 
      40055d:   48 c7 45 f0 16 06 40    mov    QWORD PTR [rbp-0x10],0x400616
      400564:   00 
      400565:   48 8b 45 f8             mov    rax,QWORD PTR [rbp-0x8]
      400569:   48 89 c7                mov    rdi,rax
      40056c:   e8 9f fe ff ff          call   400410 <puts@plt>
      400571:   48 8b 45 f0             mov    rax,QWORD PTR [rbp-0x10]
      400575:   48 89 c7                mov    rdi,rax
      400578:   e8 93 fe ff ff          call   400410 <puts@plt>
      40057d:   bf 00 00 00 00          mov    edi,0x0
      400582:   e8 b9 fe ff ff          call   400440 <exit@plt>
      400587:   66 0f 1f 84 00 00 00    nop    WORD PTR [rax+rax*1+0x0]
      40058e:   00 00
Run Code Online (Sandbox Code Playgroud)

因此,从列表中可以清楚地看出这两个字符串是如何放置在屏幕上的。该列表提到了上面找到的两个地址 - 它们被突出显示。

因此,总而言之,您可以检查.rodata节,找到特定字符串的位置地址,然后仅 grep 查找.text节中找到的地址。