小编aye*_*kat的帖子

x86多字节NOP和指令前缀

回想一下,x86体系结构定义0x0F 0x1F [mod R/M]为多字节NOP。

现在,我看一个8字节NOP的特殊情况:

0x0F 0x1F 0x84 0x__ 0x__ 0x__ 0x__ 0x__
Run Code Online (Sandbox Code Playgroud)

最后5个字节具有任意值。

第三个字节[mod R/M]拆分得到:

现代

  • mod = 10b:参数为reg1+ DWORD大小的位移
  • reg2 = 000b:(我们不在乎)
  • reg1 = 100b:表示参数改为SIB字节+ DWORD大小的位移。

现在,举一个具体的例子

0x0F 0x1F 0x84 0x12 0x34 0x56 0x78 0x9A
Run Code Online (Sandbox Code Playgroud)

我有

  • SIB = 0x12
  • displacement = 0x9A785634:DWORD

现在,我添加0x66指令前缀以指示位移应为WORD而不是DWORD:

0x66 0x0F 0x1F 0x84 0x12 0x34 0x56 0x78 0x9A
Run Code Online (Sandbox Code Playgroud)

我希望0x78 0x9A被“切断”并被视为新的指示。但是,当编译它并objdump在生成的可执行文件上运行时,它仍然使用所有4个字节(一个DWORD)作为位移。

在这种情况下,我是否误解了“位移”的含义?还是0x66前缀对多字节NOP指令没有任何影响?

x86 prefix nop

5
推荐指数
1
解决办法
2513
查看次数

标签 统计

nop ×1

prefix ×1

x86 ×1