段间跳转之中断门

IDTR与IDT

中断描述符表寄存器IDTR有48位,其中32位存储中断描述符表的基地址,剩余16位存储表的长度。IDT就是中断描述符表,中断描述符表中存储中断门,陷阱门和任务门的门描述符。

中断门描述符

中断门描述符与调用门描述符差不多,其低四个字节的高16位存储的是隐藏的段选择子,中断跳转的目标地址为:隐藏的段选择子指向的段的基地址 + 偏移地址

中断门提权

无论中断提权与不提权,中断成功都需要 中断门的DPL = CPL。

我们在IDT表的第0x20索引位置构造一个中断门,此中断门的中断描述符的隐藏段选择子的索引为1,指向一个DPL为0的代码段。

然后我们执行int 0x20,代码会跑到0x00427200处。cs变为8,cpl为0权限提升了,所以堆栈也发生了切换地址为高2GB。

我们在windbg中查看堆栈

所以利用中断门提权堆栈变化如下

中断门不提权

我们在IDT表的第0x20索引位置构造一个中断门,此中断门的中断描述符的隐藏段选择子的索引为3,指向一个DPL为3的代码段。

int 0x20指令执行前堆栈如下

然后我们执行int 0x20,代码会跑到0x00427200处。cpl还为3权限未提升了,所以堆栈没有发生。

所以得出利用中断门不提升权限时的堆栈的变化如下:

注意:之所以在中断时需要保护EFLAGS寄存器是因为中断会将IF位置0来拒绝一切可屏蔽中断。因为中断门主要是用于描述中断处理程序的入口,中断分为可屏蔽中断和不可屏蔽中断,将IF置零使其拒绝一切可屏蔽中断。

posted @ 2021-02-28 23:35  怎么可以吃突突  阅读(205)  评论(0编辑  收藏  举报