assembly - x86-64中断期间程序寄存器存储在哪里
问题描述
对于大学作业,我的任务是使用 x86-64 中的汇编代码覆盖除零中断处理程序,使其除法运算结果将是除数 - 1。
所以据我了解,我需要在返回程序之前更改除法寄存器的值。
如何获取程序的原始寄存器值并更改它们?它们存储在哪里?
解决方案
中断/异常仅在异常帧本身中保存 CS:RIP、RFLAGS 和用户空间 SS:RSP。所有其他寄存器值均未修改。x86 不像其他一些 ISA 那样进行寄存器组切换。
中断处理程序必须保存/恢复他们想要使用的每个寄存器,以确保他们不会修改用户空间状态。您需要它来获得几个暂存寄存器(除非您做出多个假设并且只支持一个操作数大小和指令长度),但您要修改的用户空间状态部分仍在寄存器中。
幸运的是,根据除法指令https://www.felixcloutier.com/ x86/idiv或div
. (或者,如果您包括 16 / 32 位兼容模式用户空间,也可能只是 AL for aam imm8
)
因此,您不必解码寻址模式,只需解码前缀和操作码,即可确定实际涉及 RDX 和 RAX 的哪些部分。
但是要在除法指令之后返回 RIP 指向,您实际上需要计算出指令长度,例如 2 字节div ecx
与div word [rdi + r10*2 + 256]
(9 字节:REX 和操作数大小前缀、操作码、modrm+SIB + disp32)。
您确实知道长度是 <= 15 字节(包括可能的冗余前缀),否则它会因 #UD 而不是 #DE 而出现故障。
推荐阅读
- javascript - 如何将范围输入的值与输出标签连接起来?
- flutter - 打开 Flutter Webview 链接到浏览器
- python - 使用 Python 将范围从一个 Excel 复制到另一个 Excel 时 Range 类的 PasteSpecial 方法失败
- laravel - Laravel 嵌套资源的作用域嵌套资源功能不会检查子模型是否属于父模型
- android - 如何在 Jetpack Compose 的 MutableState 中使用条件
- python - 嵌套字典/列表混合的Python自定义类在尝试删除空的时会自行清空
- swift - Xcode - 你能强制显示缩放到标准吗?
- docker - 无法在 Windows 上使用 docker toolbox w Virtualbox 运行超过 1 个端口
- c# - Unity c#在附加代码中使用下拉值而不是下拉字符串名称
- thymeleaf - Thymeleaf 模板引擎:检查变量的语法是否等于字符串文字列表中的一个