1. 陷阱门的结构
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字节
|76543210|76543210|7 65 4 3210|76543210|76543210|76543210|76543210|76543210| 比特
|-----------------|1|--|0|1111|--------|--------|--------|--------|--------| 占位
|offset in segment|P|D |S|TYPE| |segment selector |offset in segment| 含义
| 31-16 |P | | | 15-0 |
|L |
通常陷阱门是以 ----ef00 0008----
这种形式出现的,当然了,第 5 个十六进制数不一定就是 e,如果 DPL = 0 的话,那这个数就是 8. 后面的 0008 是段选择子,而左右两侧的占位符是要跳转的地址。
不细心的同学还以为我上面这段都是从中断门那里抄过来的。没错,确实是抄来的,99%相同,有2个位置我改了,一个是 TYPE 那里,在中断门中 TYPE 是 1110 ,现在改成了 1111. 后面的 ee 也改成了 ef.
其它的和中断门完全相同。那么在后面的实验里,除了在安装描述符上和中断门那不一样,测试代码甚至都不用改。
2. 实验
说了这么多,到底哪不一样?这里仍然使用中断门的实验代码。但是设计的描述符稍微不一样了一点。
- 陷阱门描述符设计
0040ef00`00081020
和前面唯一的区别就是第6位的e变成了f(之前设计的中断门描述符是 0040ee00`00081020)
- 安装描述符
eq 8003f500 0040ef00`00081020
- 执行结果
3. 陷阱门对 EFLAGS 的影响
从实验结果上可以看到与上节不同的是,这里的EFLAGS并未受到影响。不同于上节,进入中断门,CPU会把EFLAGS中的IF位置1,而进入陷阱门,CPU并不修改 IF 位。
4. 陷阱门对堆栈的影响
同中断门一样,当代码从 3 环进入 0环时,CPU同样做两件事。
- 切换到 0 环栈(也就是修改 ss 段寄存器和 esp 寄存器)
- 在0环栈中压入 ss3, esp3, eflags, cs3, eip3
在提权的时候,一直遗留了一个小小细节,0 环栈的段描述符 ss0 和 栈顶指针 esp0,从哪里来?如果你想到了这个问题,是否冒出了黑人问号 ????
本节并不打算讲 TSS(Task State Segment,任务状态段),但是为了引出这个话题,先抛出名词。然后告诉你,CPU在切换栈的时候,SS和ESP来源于 TSS。
TSS 位于内存中的某个位置,结构固定。其中两个字段,就保存了 SS0 和 ESP0.
5. 代码
本节代码和上节中断门完全相同,请移步至中断门查看代码。