任务段(TSS)
概念:
TSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程)切换时的任务现场信息。
作用:
TSS在任务切换起重要作用,主要通过TSS实现任务的挂起和恢复,任务切换是指当前程序执行另一程序。在任务切换的时候,处理器中的各个寄存器的值自动保存到TR任务寄存器中指定的TSS中,然后下一个任务的TSS选择子被装在到TR中,然后将TR指向的TSS中取出各个寄存器的值放入处理器的各个寄存器中。(由于TSS中存在cs和ss所以可用于提权)
TSS在内存中是一块大小为104个字节,存储着各个寄存器的值
描述符
TYPE:9(未被加载)B(加载后)
Previous Task Link:上一个任务链切换tss时,会把上一个tss保存在这里ESP0\ESP1\ESP2:分别代表R0\R1\R2
操作TR寄存器
LTR指令:把tss装在tr寄存器;STR,读取tr寄存器,只读取16位,段选择子)tss是一块内存,最小104个字节,里面的值是实模式进保护模式时候预填充的tr寄存器 12位,指向tss(一个段选择子)
任务门
任务段没有base,通过任务段找到TSS
TSS切换实验:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
char trs[6]={0};
char gdts[6]={0};
void __declspec(naked) test()
{
__asm
{
//jmp fword ptr trs;
iretd;
}
}
int main(int argc,char * argv[])
{
char stack[100]={0};
DWORD cr3=0;
printf("cr3:");
scanf("%X",&cr3);
DWORD tss[0x68]={
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
cr3,
(DWORD)test,
0,
0,
0,
0,
0,
((DWORD)stack) - 100,
0,
0,
0,
0x23,
0x08,
0x10,
0x23,
0x30,
0,
0,
0x20ac0000
};
WORD rs=0;
_asm
{
sgdt gdts;
str ax;
mov rs,ax;
}
*(WORD*)&trs[4]=rs;
char buf[6]={0,0,0,0,0x48,0};
__asm
{
call fword ptr buf;
}
printf("zsaddfsafdsa\n");
return 0;
}
JMP FAR和CALL FAR访问任务段的区别:
通过call(不能用jmp原因是只有call会把eflags NT置1,NT位会对iret指令产生影响 NT位如果为0,iret的值从堆栈中取(中断返回);如果NT位为1,会找TSS中的Previous Task Link进行返回)