10.任务门
Reserved保留的填0就行
(TSS Segment Selector)存放TSS段描述符
任務門執行過程:
構造一個TSS先
xx00e9xx`xxxx0068
構造IDT(我代碼的選擇子是48)
0000e500`00480000
代碼:
#include<windows.h> #include<stdio.h>typedef struct TSS {DWORD link; // 保存前一個 TSS 段選擇子,使用 call 指令切換寄存器的時候由CPU填寫。// 這 6 個值是固定不變的,用于提權,CPU 切換棧的時候用DWORD esp0; // 保存 0 環棧指針DWORD ss0; // 保存 0 環棧段選擇子DWORD esp1; // 保存 1 環棧指針DWORD ss1; // 保存 1 環棧段選擇子DWORD esp2; // 保存 2 環棧指針DWORD ss2; // 保存 2 環棧段選擇子// 下面這些都是用來做切換寄存器值用的,切換寄存器的時候由CPU自動填寫。DWORD cr3;DWORD eip;DWORD eflags;DWORD eax;DWORD ecx;DWORD edx;DWORD ebx;DWORD esp;DWORD ebp;DWORD esi;DWORD edi;DWORD es;DWORD cs;DWORD ss;DWORD ds;DWORD fs;DWORD gs;DWORD ldt;// 這個暫時忽略DWORD io_map; } TSS;char st[10] = { 0 }; // 0042b034 DWORD g_esp = 0; DWORD g_cs = 0;TSS tss = { // 0x00427b400x00000000,//link(DWORD)st, //esp00x00000010,//ss00x00000000,//esp10x00000000,//ss10x00000000,//esp20x00000000,//ss20x00000000,//cr30x0045a0c0,//eip-----填裸函數地址0x00000000,//eflags0x00000000,//eax0x00000000,//ecx0x00000000,//edx0x00000000,//ebx(DWORD)st, //esp0x00000000,//ebp0x00000000,//esi0x00000000,//edi0x00000023,//es 0x00000008,//cs 0x00000010,//ss0x00000023,//ds0x00000030,//fs0x00000000,//gs0x00000000,//ldt0x20ac0000 };void __declspec(naked) func() {//0045a0c0__asm {int 3mov g_esp, espxor eax,eaxmov ax, csmov g_cs, eaxiretd} } int main(int argc, char* argv[]) {printf("%x\n", &tss);printf("cr3:\n");scanf("%x", &(tss.cr3));char buffer[6] = { 0, 0, 0, 0, 0x48, 0 };__asm {int 0x20}printf("g_cs = %08x\ng_esp = %08x\n", g_cs, g_esp);getchar();return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 9.任务段(TSS)
- 下一篇: 11.分页(10-10-12)