9

16 進エディターを使用して、実行可能ファイルで宣言された整数変数の値を変更したいのですが、コードで宣言された変数型 int があり、変数が次のとおりであることを知っているとします。

整数値 = 1337;

16 進エディタを使用して値 1337 を検索して実行可能ファイルを編集し、別の値に変更したいです。ubuntu で ghex を試しましたが、検索方法がわかりません。16 進数に変換しましたが、見つかりませんでした。 、よろしくお願いします。

4

1 に答える 1

24

まず、 を使用readelfして、変数の仮想アドレス (プログラムがロードされた後のメモリ内の場所) を決定します。-sシンボル テーブルが表示され、変数の名前が grep されます。

readelf -s a.out | grep value

これにより、次のような行が出力されます。

    64: 000000000060102c     4 OBJECT  GLOBAL DEFAULT   24 value

ここでは、ファイルの 64 番目の記号はvalue. そのロード アドレスは 0x60102c で、サイズは 4 バイトです。これで仮想アドレスが得られましたが、これはファイル内のどこにあるのかわかりません。そのためには、次の 3 つのことを行う必要があります。

  1. それがどのセクションにあるかを把握し、
  2. この値のセクション オフセットを計算します
  3. そのセクション オフセットをそのセクションのファイル オフセットに追加して、項目の実際のファイル オフセット(ELF ファイルを開いた場合に 16 進エディターに表示される「アドレス」) を取得します。

また走ろうreadelf-Sセクションをリストします。

readelf -S a.out

出力のスニペットを次に示します。変数のアドレスはであり、そのと そのの間に60102cあるセクションを探していることを思い出してください。これは読み書き可能な変数なので、セクションにあると推測できます。60102cAddressAddress + Size.data

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  ...
  [21] .dynamic          DYNAMIC          0000000000600e28  00000e28
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000600ff8  00000ff8
       0000000000000008  0000000000000008  WA       0     0     8
  [23] .got.plt          PROGBITS         0000000000601000  00001000
       0000000000000028  0000000000000008  WA       0     0     8
  [24] .data             PROGBITS         0000000000601028  00001028
       0000000000000008  0000000000000000  WA       0     0     4
  [25] .bss              NOBITS           0000000000601030  00001030
       0000000000000008  0000000000000000  WA       0     0     4
  [26] .comment          PROGBITS         0000000000000000  00001030
       000000000000002c  0000000000000001  MS       0     0     1

案の定、 toのメモリに住んで.dataます。このセクションのアドレスから のアドレスを引くと、次のようになります。601028601028+8 = 601030value

  60102c       Address of `value`
- 601028       Start address of .data section
--------
       4

したがって、セクションvalueの先頭からオフセット 4 にあり.dataます。.dataでは、セクションはファイル内のどこにあるのでしょうか。それがOffsetコラムが教えてくれることです。 .dataはファイル オフセットから始まります1028。これを知っていると、次のファイル オフセットを見つけることができますvalue

  1028         File offset of .data section
+    4         Offset of `value` in .data section
-------
  102c         File offset of `value`

ファイル オフセットが得られたので、何が期待できるかを確認しましょう。変数の値は 1337 です。16 進数では 0x539 です。ただし、バイト オーダー(または「エンディアン」) を設定する必要があります。Intel x86 システムはリトルエンディアンです。つまり、1 バイトより大きい整数がアドレスに格納されている場合、値の最下位バイト (または「小さい」端) がそのアドレスにあり、残りのバイトは後続 (増加するアドレス) にあります。

したがって、1337 はint次のようにファイルに (4 バイトとして)格納されます。

39 05 00 00

「ビッグ エンディアン」システム (Motorola 68k など) では、ファイル内の値は逆の順序で表示されます。

00 00 05 39

つまり、ELF ファイルを 16 進エディタで開くと、オフセット 102c に移動すると、値が表示されます。

ここに画像の説明を入力

ELF ファイルにはチェックサムや CRC がないため、16 進エディタでその値を編集するだけで、プログラムの実行時に新しい値が設定されます!

于 2013-12-19T00:34:21.480 に答える