【问题标题】:ELF file - get function of where a string is usedELF 文件 - 获取字符串使用位置的函数
【发布时间】:2018-03-16 07:49:35
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: debugging elf execute


    【解决方案1】:

    让我们考虑以下示例:

    test.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);
    }
    

    让我们编译它: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.
    

    显示起始地址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
    

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

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

    【讨论】:

    • 多么棒的答案!我现在有了我的字符串的地址,它工作正常。如果我尝试阅读 .text 部分,似乎我没有绝对引用内存。示例输出: 14045fc4: 40 1e 00 18 bne cr7,14045fdc <_init> 所以我需要知道例如“_init”位于哪个地址。但是有成千上万的相对地址。即使有这个参考,是否有一种优雅的方法可以找到它?
    • 这是不可能的,进一步挖掘这个文件,因为它被剥离了很多?如果可能的话,我想结束:找出函数的位置。获取函数的参数。读取从程序调用的参数,最后 - 更改参数以使用不同的参数调用函数。这是否有可能,或者这只是一个梦想;)?
    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2014-06-23
    • 2017-12-27
    • 1970-01-01
    • 2011-12-06
    • 2012-10-22
    • 2017-09-30
    相关资源
    最近更新 更多