2017-10-04 13 views
2

私はelfファイルを持っています。実行可能ファイルで変数(文字列)が使用されていることについて、いくつかの情報を得ることができるかどうかを知りたいと思います。ELFファイル - 文字列が使用される場所の関数を取得

.elfの文字列を印刷すると、興味深い文字列が見つかりました。どの機能で使用されているか知りたいのですが、これは何とか可能ですか?

ありがとうございました!

答えて

1

のは、次の例を考えてみましょう:

#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); 
} 

test.cのはのは、それをコンパイルしてみましょう: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が表示されます。 の4つのドットが最初の文字列定数の前に表示されるため、文字列aのアドレスは0x00400614になります。 aをスキップし、ヌルバイト(デリミタ)はバイトをスキップし、abcのアドレスは0x00400616になります。 この時点で、2つのアドレスが分かっています。

次に、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 <[email protected]> 
     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 <[email protected]> 
     40057d: bf 00 00 00 00   mov edi,0x0 
     400582: e8 b9 fe ff ff   call 400440 <[email protected]> 
     400587: 66 0f 1f 84 00 00 00 nop WORD PTR [rax+rax*1+0x0] 
     40058e: 00 00 

、それは二つの文字列を画面上に置いているかのリストから非常に明確です。リストには、上記の2つのアドレスが記載されています。

したがって、.rodataセクションを調べて、特定の文字列のロケーションアドレスを見つけて、.textセクション内にあるアドレスをgrepするだけでよいでしょう。

+0

これはすばらしい答えです。 私の弦のアドレスは今ではありますが、それはうまくいきます。 .textセクションを読み込もうとすると、メモリへの絶対参照がないようです。出力例:14045fc4:40 1e 00 18 bne cr7,14045fdc <_init + 0x19a4c>だから私は知る必要があります。アドレス「_init」が配置されています。しかし、相対アドレスは何千もあります。この参考文献でも、それを見つけるためのエレガントな方法はありますか? – Manuel

+0

これは、このファイルにさらに掘り下げることは不可能ですか? 可能であれば、私は何をしたいですか?機能の場所を調べてください。関数の引数を取得します。プログラムから呼び出された引数を読み、最後に引数を変更して、関数を別のもので呼び出す。これはどういうわけか可能なのか、それともただの夢ですか?) – Manuel

関連する問題