当程序中使用指令 call / jmp,以及通过 int 引发中断例程的执行,这将都是对目标的 code segment 进行访问,当通过权限的检查后程序将会跳转到目标的 code segment 进行执行。
在 code segment 的访问过程中涉及到权限级别的改变,stack 的改变等问题。
访问目标 code segment 的几种情形:
1、call / jmp offset
在段内直接 call / jmp,不改变目标 code segment
2、call / jmp code_selector:offset
直接 call / jmp 目标 code segment
3、call / jmp callgate_selector:offset
使用 call gate 的 call / jmp 形式
4、call / jmp tss_selector:offset
使用 TSS gate 的直接 call / jmp 形式,使用了 TSS 任务切换机制
5、call / jmp taskgate_selector:offset
通过 task gate 使用 TSS 任务切换机制
6、int n
使用 int 指令调用 interrupt / trp 例程,或者 task gate 提供的任务切换机制
7、使用 syscall / sysret、 sysenter / sysexit 指令快速调用系统服务例程
8、ret 或 iret
利用 ret 以及 iret 指令构造另一种访问 code segment 的途径。
以上是程序中主动发起访问目标 code segment 大多数方法,在继续执行之前,processor 会进行一系统的检查,包括相关的权限检查、type 检查、limit 检查等,通过了检查后,加载到 cs:rip 后继续执行。
阅读(1256) | 评论(1) | 转发(0) |