2012-04-27 11 views
1

今、私はEIPレジスタからマシン命令のアドレスを持っています。この機械命令はメモリのある領域の値を変更する可能性がありますが、このメモリのアドレスは取得できません。1つのマシン命令が書き込むアドレスを取得する方法は?

もちろん、私はマシンの命令のアドレスからデータを読み取ることができましたが、コンテンツは0x8b0c4d8b ......のようなマシン命令です。読めません(gdbのようなデバッグツールは使用できません)。

1つのマシン命令が書き込むアドレスを取得するにはどうすればよいですか?

+1

デバッガを使用する - その命令のアドレスにブレークポイントを設定し、ブレークポイントにヒットしたときにEIPを調べます - これは唯一の信頼できる方法です。 –

+0

しかしEIPは命令のアドレスです、そうですか?私はまだこの命令が書き込むアドレスを得ることができません。 – zsounder

+0

私は@PaulR misspokeだと思います。それにもかかわらず、逆アセンブラ(または1つのツールが組み込まれたツール)を使用するか、x86オペコードを逆アセンブルする方法を知っている独自のツールを作成する必要があります。 – geekosaur

答えて

1

あなたがマシンコードEIP・ポイントを知っているし、あなたはそれを逆アセンブルしたい場合は、この(私は0x8b0c4d8bのあなたの例を取っ​​た)ような何か:だから

 
#create binary file 
$ echo -en "\x8b\x0c\x4d\x8b" > foo.bin 

#disassemble it 
$ objdump -D -b binary -m i386 foo.bin 

foo.bin:  file format binary 


Disassembly of section .data: 

00000000 : 
    0: 8b      .byte 0x8b 
    1: 0c 4d     or  $0x4d,%al 
    3: 8b      .byte 0x8b 

を、この場合には、それはdoesnの任意のメモリ位置を変更しますが、そうした場合は、アセンブリコードから簡単に確認できます。

編集:これはプログラムから行うと思われるようです。 udis86をご覧ください。それは指示のexamining operandsを可能にする。 ARMの場合は、disarmを参照してください。

+0

Ooops申し訳ありませんが、私のサンプル0x8b0c4d8bは良いものではありません。 – zsounder

+0

これは一般的なケースでは機能しません。ハードコードされたアドレス(レジスタベースのアドレッシングが含まれていない場合のみ)でしか動作しません。信頼できる唯一の方法は、デバッガでコードを実行し、 。 –

+0

@PaulR:そうだね。 OPは彼がデバッガを使用することはできないと述べたので、私はこの答えを提供しました。 – Job

関連する問題