4

违规行:

 8048f70:   ff 24 85 00 a4 04 08    jmp    *0x804a400(,%eax,4)

位置 804a400 的反汇编代码中没有指令(我的列表以 804a247 结尾)

当我检查该内存位置的内容时,我得到:

(gdb) x/c 0x804a40c
0x804a40c:  -103 '\231'

(gdb) x/t 0x804a40c
0x804a40c:  10011001

(gdb) x/s 0x804a40c
0x804a40c:   "\231\217\004\b\222\217\004\b\211\217\004\b\202\217\004\bw\217\004\b\002"

(gdb) x/3x 0x804a40c
0x804a40c:  0x99    0x8f        0x04

这个 jmp 语句到底想做什么?

4

1 回答 1

9

该指令是间接跳转。这意味着指定的内存地址不是跳转目标,而是指向跳转目标的指针。

首先,指令加载内存地址处的值:

*0x804a400(,%eax,4)

更明智地写成:

0x804a400 + %eax * 4  // %eax can be negative

然后将 %eip 设置为该值。

解读这些信息的最佳方法是使用英特尔程序员参考手册。第 2A 卷中的表 2-2 提供了 ModR/M 字节的细分,在这种情况下还提供了 SIB 字节。

于 2012-10-11T20:31:27.753 回答