これで、EIPレジスタから機械命令のアドレスを取得しました。このマシン命令は、メモリの特定の領域の値を変更する可能性があります。必要ですが、このメモリのアドレスを取得できません。
もちろん、マシン命令のアドレスからデータを読み取ることはできますが、内容は0x8b0c4d8b ......のようなマシン命令であり、読み取れません(gdbのようなデバッグツールは使用できません)。
1つのマシン命令が書き込むアドレスを取得するにはどうすればよいですか?
これで、EIPレジスタから機械命令のアドレスを取得しました。このマシン命令は、メモリの特定の領域の値を変更する可能性があります。必要ですが、このメモリのアドレスを取得できません。
もちろん、マシン命令のアドレスからデータを読み取ることはできますが、内容は0x8b0c4d8b ......のようなマシン命令であり、読み取れません(gdbのようなデバッグツールは使用できません)。
1つのマシン命令が書き込むアドレスを取得するにはどうすればよいですか?
EIPが指すマシンコードを知っていて、それを逆アセンブルしたい場合は、次のようにします(例を挙げます0x8b0c4d8b
)。
#バイナリファイルを作成 $ echo -en "\ x8b \ x0c \ x4d \ x8b"> foo.bin #分解する $ objdump -D -b binary -m i386 foo.bin foo.bin:ファイル形式のバイナリ セクション.dataの逆アセンブル: 00000000: 0:8b .byte 0x8b 1:0c4dまたは$0x4d、%al 3:8b .byte 0x8b
したがって、この場合、メモリの場所は変更されませんが、変更された場合は、アセンブリコードから簡単に確認できます。
編集:コメントから、これをプログラムで実行したいようです。udis86を見てください。命令のオペランドを調べることができます。ARMについては、武装解除を参照してください。