相対オフセットの代わりに hexdump から絶対メモリアドレスを取得します。

相対オフセットの代わりに hexdump から絶対メモリアドレスを取得します。

私はメモリアドレスをよりよく理解しようとしています。私hexdump.はEx出力でバイナリを確認し始めました。

0000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00
0000010 0e 00 00 00 b0 03 00 00 85 00 00 00 00 00 00 00
0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45
0000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000040 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00

私が理解したように、各行の先頭に表示されるコードは、ベースアドレスのオフセットで表される相対メモリアドレスです。絶対住所を知る方法があるかどうか疑問に思います。

これらのアドレスを明示的に表示したり、そのアドレスが相対的なベースアドレスを特定して直接計算できるようにするソリューションがあればうれしいです。

答え1

Hexdumpはアドレス(またはメモリ)について何も知りません。単にバイトストリームを印刷し、これまでに見たバイト数を前に追加します。入力がファイルから来る場合、この数字はファイルの場所に対応します。

ファイルがロードされた後にこれらのバイトがメモリ内で終わる場所を特定するには、ファイルのメタデータを調べる必要があります。 ELFファイルの場合、これはセクションヘッダー(場合によってはプログラムヘッダー)を意味します。

readelf -S path/to/your/binary次のように表示します。

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [13] .text             PROGBITS         000000000050eac0  0010eac0
       0000000001833275  0000000000000000  AX       0     0     16

ここで、「オフセット」値はファイル内の特定のセクションが始まる場所であり、「アドレス」値は対応する仮想アドレス(メモリで終わる場所)です。hexdump住所を取得するには、これらの2つの違いを数字に追加するだけです。

objdump -h path/to/your/binary以下を使用して同じデータを取得することもできます。

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
 12 .text         01833275  000000000050eac0  000000000050eac0  0010eac0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

同様に、「ファイルオフ」はファイルのオフセットであり、「VMA」は対応する仮想アドレスである。 「LMA」が何なのか気になったら見てくださいここ

答え2

私が理解したのは、絶対物理アドレスは非常に安全です。しかし、論理アドレスを見つける方法があります。学習目的のために無限ループを含み、バックグラウンドで実行される単純なCプログラムを書くことができます。プログラムの実行中は、Linuxユーティリティ「pmap」を使用してプログラムの仮想アドレスをバイパスできます。 Linux zshのバックグラウンドで実行可能ファイルを実行するコマンド:

実行可能ファイル名と
pmap -x process_id

関連情報