6

为什么nop分配到0x90intel x86 程序集上?

直觉上,我希望这0x00会映射到nop(也在xchg eax, eaxintel x86 上),因为它是ARM A32和其他一些架构的情况一样。

4

1 回答 1

10

0x00000000 实际上不是 ARM A32 上的 NOP,尽管它的行为类似于一个;实际上andeq r0, r0, r0,真正的 NOP 是0xe1a00000(mov r0, r0)。让 NUL 字节成为 NOP 是一个相当糟糕的主意,因为这会使每个空内存区域都成为空闲的 NOP 滑动,从而大大增加了攻击的风险。现代架构通常尝试使全零成为中断指令或类似指令,以避免这种攻击向量。例如,ARM A64 制作0x00000000了一条永久未定义的指令udf 0

0x90实际上只是0x90 + r操作码系列的一条指令,它代表xchg r32, eax. eax是寄存器 0,所以0x90代表xchg eax, eax它是一个 NOP。在长模式下,0x90特殊情况下不将高 32 位清零rax以保持其作为单字节 NOP 的功能。

于 2019-05-01T20:19:16.533 回答