16 進エディターを使用して、実行可能ファイルで宣言された整数変数の値を変更したいのですが、コードで宣言された変数型 int があり、変数が次のとおりであることを知っているとします。
整数値 = 1337;
16 進エディタを使用して値 1337 を検索して実行可能ファイルを編集し、別の値に変更したいです。ubuntu で ghex を試しましたが、検索方法がわかりません。16 進数に変換しましたが、見つかりませんでした。 、よろしくお願いします。
16 進エディターを使用して、実行可能ファイルで宣言された整数変数の値を変更したいのですが、コードで宣言された変数型 int があり、変数が次のとおりであることを知っているとします。
整数値 = 1337;
16 進エディタを使用して値 1337 を検索して実行可能ファイルを編集し、別の値に変更したいです。ubuntu で ghex を試しましたが、検索方法がわかりません。16 進数に変換しましたが、見つかりませんでした。 、よろしくお願いします。
まず、 を使用readelf
して、変数の仮想アドレス (プログラムがロードされた後のメモリ内の場所) を決定します。-s
シンボル テーブルが表示され、変数の名前が grep されます。
readelf -s a.out | grep value
これにより、次のような行が出力されます。
64: 000000000060102c 4 OBJECT GLOBAL DEFAULT 24 value
ここでは、ファイルの 64 番目の記号はvalue
. そのロード アドレスは 0x60102c で、サイズは 4 バイトです。これで仮想アドレスが得られましたが、これはファイル内のどこにあるのかわかりません。そのためには、次の 3 つのことを行う必要があります。
また走ろうreadelf
。-S
セクションをリストします。
readelf -S a.out
出力のスニペットを次に示します。変数のアドレスはであり、そのと そのの間に60102c
あるセクションを探していることを思い出してください。これは読み書き可能な変数なので、セクションにあると推測できます。60102c
Address
Address + 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
ます。このセクションのアドレスから のアドレスを引くと、次のようになります。601028
601028+8 = 601030
value
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 進エディタでその値を編集するだけで、プログラムの実行時に新しい値が設定されます!