私はelfファイルを持っています。実行可能ファイルで変数(文字列)が使用されていることについて、いくつかの情報を得ることができるかどうかを知りたいと思います。ELFファイル - 文字列が使用される場所の関数を取得
.elfの文字列を印刷すると、興味深い文字列が見つかりました。どの機能で使用されているか知りたいのですが、これは何とか可能ですか?
ありがとうございました!
私はelfファイルを持っています。実行可能ファイルで変数(文字列)が使用されていることについて、いくつかの情報を得ることができるかどうかを知りたいと思います。ELFファイル - 文字列が使用される場所の関数を取得
.elfの文字列を印刷すると、興味深い文字列が見つかりました。どの機能で使用されているか知りたいのですが、これは何とか可能ですか?
ありがとうございました!
のは、次の例を考えてみましょう:
#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するだけでよいでしょう。
これはすばらしい答えです。 私の弦のアドレスは今ではありますが、それはうまくいきます。 .textセクションを読み込もうとすると、メモリへの絶対参照がないようです。出力例:14045fc4:40 1e 00 18 bne cr7,14045fdc <_init + 0x19a4c>だから私は知る必要があります。アドレス「_init」が配置されています。しかし、相対アドレスは何千もあります。この参考文献でも、それを見つけるためのエレガントな方法はありますか? – Manuel
これは、このファイルにさらに掘り下げることは不可能ですか? 可能であれば、私は何をしたいですか?機能の場所を調べてください。関数の引数を取得します。プログラムから呼び出された引数を読み、最後に引数を変更して、関数を別のもので呼び出す。これはどういうわけか可能なのか、それともただの夢ですか?) – Manuel