首页 > 解决方案 > x86-64中断期间程序寄存器存储在哪里

问题描述

对于大学作业,我的任务是使用 x86-64 中的汇编代码覆盖除零中断处理程序,使其除法运算结果将是除数 - 1。

所以据我了解,我需要在返回程序之前更改除法寄存器的值。

如何获取程序的原始寄存器值并更改它们?它们存储在哪里?

标签: assemblyx86-64interrupt-handling

解决方案


中断/异常仅在异常帧本身中保存 CS:RIP、RFLAGS 和用户空间 SS:RSP。所有其他寄存器值均未修改。x86 不像其他一些 ISA 那样进行寄存器组切换。

中断处理程序必须保存/恢复他们想要使用的每个寄存器,以确保他们不会修改用户空间状态。您需要它来获得几个暂存寄存器(除非您做出多个假设并且只支持一个操作数大小和指令长度),但您要修改的用户空间状态部分仍在寄存器中。


幸运的是,根据除法指令https://www.felixcloutier.com/ x86/idivdiv. (或者,如果您包括 16 / 32 位兼容模式用户空间,也可能只是 AL for aam imm8

因此,您不必解码寻址模式,只需解码前缀和操作码,即可确定实际涉及 RDX 和 RAX 的哪些部分。

但是要在除法指令之后返回 RIP 指向,您实际上需要计算出指令长度,例如 2 字节div ecxdiv word [rdi + r10*2 + 256](9 字节:REX 和操作数大小前缀、操作码、modrm+SIB + disp32)。

您确实知道长度是 <= 15 字节(包括可能的冗余前缀),否则它会因 #UD 而不是 #DE 而出现故障。


推荐阅读