1.调用门执行流程
指令格式:CALL CS:EIP(EIP是废弃的)
执行步骤:
- 根据CS的值查GDT表,找到对应段描述符,这个描述符是一个调用门
- 在调用门描述符中存储另一个代码段段的选择子
- 选择子指向的段 ,段.BASE +偏移地址 就是真正执行的地址
2.门描述符
S位一定是0; 只有为0 才是系统段描述符 TYPE位为1100的时候则是门描述符; |
|
代码真正要执行的地址是:Segment Selecotor段选择子的BASE + 由Offset in Segment 两段组合起来的偏移
3.如何自己构建一个调用门?
首先 从高字节写:
31-16位 是偏移暂时不知道所以0代替 0000
16-12位 p位(段描述符是否有效) 一定是1 DPL 置成11(3环下写的一致性代码访问) 组合则是 1110 也就是E
11-8位 Type域 (如果是调用门)一定是1100 也就是C
7-5位 默认0
4-0位 调用门的参数 这里暂时填0
低字节:
31-16位 选择子(可以设置提权和不提权)不提权:001B 提权:0008 (拆分查选择子表)
15-0位 是偏移和高字节31位-16位组合成偏移地址:暂时不知道所以0代替 0000
组合完成: 0000EC00 00080000
修改内容指令eq:
kd> eq 地址 修改内容
4.调用门总结: