2017-05-03 17 views
3

私はLinux X86_64で作業しています。PLTスタブのアドレスを見つける

エントリが表す動的関数の名前を指定して、ELFファイル内の特定のPLTエントリのアドレスを決定する必要があります。 私はアドレスからのファイルのオフセットを知ることができますが、私はアドレスを決定できる必要があります。

を使用してELFファイルを逆アセンブルすると、objdumpはPLTの各エントリにシンボリック名を使用しています。 (ここで、これらのアドレスやシンボル名との関係を得るobjdumpのでしょうか?)

例:

0000000000000041a2b0 [email protected]: 

私はobjdump -T elffile | grep filenoを使用している場合、私はこのような何かを得る:私はするために必要なもの

0000000000000 DF *UND* 00000000000000000 GLIBC_2.2.5 fileno 

"C"から行うことができるのは、特定の動的関数用のELFファイル内のPLTエントリを見つけてアドレスを取得することです。

背景は、既存のELFファイルにパッチを当てており、関数呼び出しを別の動的関数にリダイレクトする必要があるということです。私は手動でELFファイルをobjdumpの逆アセンブリから集めたアドレスを使ってパッチし、これが私の特定のアプリケーションでうまくいくことを証明しました。プログラムから実行できる必要があります。私は、objdump逆アセンブラコードをクロールしてPLTのエントリシンボルとアドレスを取得する方法を理解しないことを望んでいます。

答えて

1

私はこれを理解しました: rela.pltセクションで再配置テーブルを解析する必要があります。 これらのエントリには、動的シンボルセクションにインデックスを付けて関数名をルックアップするために使用できる文字列テーブルインデックスが含まれています。動的シンボルセクションの各エントリには、関数名を引き出すのに使用できる動的文字列テーブルオフセットが含まれています。対応するファンクションを見つけると、再配置テーブルへのインデックス(+1)は、関数PLTエントリの.pltセクションへのインデックスに対応します。したがって、特定のエントリのアドレスを計算するには、.plt.sec address +((relocation_index + 1)* .pltエントリサイズ)

この方法はx86で機能します。 .pltセクションの形式がまったく異なるPPCでは機能しません。誰かがPPCのためにこれを行う上で任意の情報を持っている場合は投稿してください。

+0

i386の場合、PLTエントリのサイズは正しく報告されません。報告されたpltエントリー・サイズに4を掛けたり、エントリー・サイズに16を使用することができます。 – codemonkey

関連する問題