现在我已经从EIP寄存器获得了机器指令地址。这个机器指令可以改变某个区域的内存的值,我想要但不能得到这个内存的地址。如何获取一条机器指令写入的地址?
当然,我可以从机器指令的地址读取数据,但内容是机器指令,如:0x8b0c4d8b ......,它是不可读的(我不能使用gdb等调试工具)。
如何获取一条机器指令将写入的地址?
现在我已经从EIP寄存器获得了机器指令地址。这个机器指令可以改变某个区域的内存的值,我想要但不能得到这个内存的地址。如何获取一条机器指令写入的地址?
当然,我可以从机器指令的地址读取数据,但内容是机器指令,如:0x8b0c4d8b ......,它是不可读的(我不能使用gdb等调试工具)。
如何获取一条机器指令将写入的地址?
如果你知道机器代码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
因此,在这种情况下,这不是”不改变任何内存位置,但如果它确实如此,你可以很容易地从汇编代码中看到它。
编辑:从评论看来,你想以编程方式做到这一点。看看udis86。它允许examining operands的说明。对于ARM,请参阅disarm。
使用调试器 - 在该指令的地址中设置断点,然后在断点处检查EIP - 这是唯一可靠的方法。 – 2012-04-27 08:00:04
但EIP是指令的地址,我说得对吗?我仍然无法获得该指令将写入的地址。 – zsounder 2012-04-27 08:12:39
我觉得@PaulR misspoke;尽管如此,仍然有必要使用反汇编程序(或者内置一个工具)或编写自己的工具来知道如何反汇编x86操作码。 – geekosaur 2012-04-27 08:16:15