违规行:
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语句到底试图做什么?
答案 0 :(得分:9)
该指令是间接跳跃。这意味着指定的内存地址不是跳转目标,而是指向跳转目标的指针。
首先,指令将值加载到存储器地址:
*0x804a400(,%eax,4)
更明智地写为:
0x804a400 + %eax * 4 // %eax can be negative
然后将%eip设置为该值。
解密这些问题的最佳方法是使用英特尔程序员参考手册。第2A卷中的表2-2提供了对ModR / M字节的分解,在这种情况下也提供了SIB字节。