装配中的星号指针(I32/x86)

use*_*133 4 x86 assembly gdb pointers att

违规行:

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

位于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
Run Code Online (Sandbox Code Playgroud)

这个jmp语句到底试图做什么?

srk*_*ing 9

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

首先,指令将值加载到内存地址:

*0x804a400(,%eax,4)
Run Code Online (Sandbox Code Playgroud)

更合理地写成:

0x804a400 + %eax * 4  // %eax can be negative
Run Code Online (Sandbox Code Playgroud)

然后将%eip设置为该值.

解密这些问题的最佳方法是使用英特尔程序员参考手册.第2A卷中的表2-2提供了对ModR/M字节的分解,在这种情况下也提供了SIB字节.