【发布时间】:2017-09-13 02:37:01
【问题描述】:
当地址覆盖用于定位较小的地址空间时,指令指针会发生什么,例如默认为 32 位地址,但覆盖转换为 16?
因此,假设我们处于 x86-32 模式,并且默认为我们所在的当前代码段的 32 位内存空间。
此外,IP 寄存器包含值 87654321h。
如果我使用 67h 覆盖默认值并使内存空间为 16 位,那么处理器如何计算当前代码段的偏移量?
必须忽略 IP 中的某些位,否则您将超出覆盖指定的 16 位内存空间。
那么,处理器是否只是忽略了 IP 寄存器中的 8765 部分?
也就是说,处理器是否只使用 4 个最低有效位而忽略 4 个最高有效位?
与访问数据段相关的地址覆盖如何?
例如,我们在 x86-32 模式下,默认为 32 位内存寻址,我们为此指令使用 67h 前缀:mov eax, [ebx]。
现在,ebx 包含一个 32 位数字。
67h 覆盖是否将上述指令更改为:mov eax, [bx]?
“常量指针”呢?示例:mov eax, [87654321]。
67h 覆盖是否会将其更改为 mov eax, [4321]?
内存覆盖是否也会影响数据段的偏移量,还是只影响代码段?
地址覆盖如何影响堆栈指针?
如果堆栈指针包含一个 32 位数字(我们将再次使用 87654321h)并且我 push 或 pop,则引用什么内存?
推送和弹出间接访问内存。
那么,您会只使用 IP 寄存器中的 4321 位而忽略最高有效位吗?
另外,细分基础本身呢?
示例:我们处于 x86-32 模式,默认为 32 位内存空间,但我们使用 67h 覆盖。
CS 寄存器指向 GDT 中的一个描述符,它的段基数同样是 87654321h。
我们直接超出了 16 位内存范围,甚至没有添加偏移量。
处理器做什么?忽略 4 个最高有效位?同样的问题可以应用于数据段和堆栈段的段描述符。
【问题讨论】:
-
地址大小前缀对获取未来指令没有影响。有关详细描述前缀的英特尔手册的链接,请参阅其他问题的答案 (stackoverflow.com/questions/46188388/…)。如果您在阅读后仍有不明白的内容,请编辑此问题。
-
@Peter 我编辑了原始问题
-
这就像 10 个问题。您应该通过组装
db 0x67/mov eax, [ebx]然后拆卸来尝试其中的一些。 (并且还组装mov eax, [bx])。也在调试器中单步执行它。然后,您可以编辑英特尔文档已经直接回答的问题。EIP永远不会被前缀截断,除了jmp或call指令,我忘了。
标签: pointers assembly x86 memory-address prefix