能力值:
( LV3,RANK:20 )
|
-
-
2 楼
esp 0 1 2的作用是用来指定 你使用任务门进1环后如果再发生由中断,调用门,陷阱门产生的权限切换的堆栈;使用任务段任务门本身过程中堆栈是由ESP和SS来决定的,和ESP 0 1 2没关系
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
Mr.hack
esp 0 1 2的作用是用来指定 你使用任务门进1环后如果再发生由中断,调用门,陷阱门产生的权限切换的堆栈;使用任务段任务门本身过程中堆栈是由ESP和SS来决定的,和ESP 0 1 2没关系
原来是这样, 感谢老哥解答啊, 我之前就一直纳闷来着
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
兄弟,为什么有任务段这种东西了还要提供一下任务门呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
请问一下,这代码直接崩了吧,能进入到func()这里,只是返回的时候无法返回吧。请问你的过了吗?还执行了什么?谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
666
|
能力值:
( LV1,RANK:0 )
|
-
-
7 楼
老哥,代码跑起来蓝了,看了下有个地方不解 0x000000b9, //fs gdt表里的index:17项好像没改哇?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
任务段 eq 8003f0c0 0000a912`FDCC0068,大兄弟,如果我没记错的化是E9吧
|
能力值:
( LV1,RANK:0 )
|
-
-
9 楼
印度硬汉
兄弟,为什么有任务段这种东西了还要提供一下任务门呢?
TSS(Task State Segment)任务状态段 一、如果你用jmp跳到TSS段,你还得自己jmp回到之前的TR寄存所保存的TSS段, 二、如果是call的话你还得修改下EFLAG寄存器的NT位,之后用iret返回。 还不如直接用状态门,只需要搞一个任务门,之后直接iret返回,不需要修改EFLAG和不需要自己jmp回来这也许就是任务门的优点吧
|
能力值:
( LV1,RANK:0 )
|
-
-
10 楼
#include <iostream>
#include <windows.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;
// I/O 位图基地址域
DWORD io_map;
} TSS;
DWORD st;
DWORD g_esp;
DWORD g_cs;
//_declspec(naked)
_declspec(naked) void func() {
__asm {
mov g_esp, esp;
mov eax,0;
mov ax, cs;
mov g_cs, eax;
iret;
}
}
TSS tss = {
0x00000000,//link
0x00000000,//esp0
0x00000010,//ss0
0x00000000,//esp1
0x00000000,//ss1
0x00000000,//esp2
0x00000000,//ss2
0x00000000,//cr3
(DWORD)func,//eip
0x00000000,//eflags
0x00000000,//eax
0x00000000,//ecx
0x00000000,//edx
0x00000000,//ebx
0x00000000,//esp
0x00000000,//ebp
0x00000000,//esi
0x00000000,//edi
0x00000023,//es
0x000000B1,//cs
0x000000C1,//ss
0x00000023,//ds
0x000000D1,//fs 进一环,我把FS也改了,因为进0环的时候FS为30,DLP为0
0x00000000,//gs
0x00000000,//ldt
0
};
int main(int argc, char* argv[])
{
/*
TSS(GDT)
eq 8003f090 0000E941`e0a00068
Task-Gate(IDT)
eq 8003f500 0000E500`00930000
CS
eq 8003f0b0 00cfBb00`0000ffff
SS
eq 8003f0c0 00cfB300`0000ffff
FS
eq 8003f0d0 ffc0B3df`f0000001
*/
st = (DWORD)VirtualAlloc((void*)0,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_EXECUTE_READWRITE);
tss.esp = st + 0x800;
tss.esp0 = st + 0x800;
printf("TSS:%x\n", &tss);
printf("func:%x\n", tss.eip);
printf("please input cr3:\n");
scanf("%x", &tss.cr3);
__asm
{
int 0x20;
}
VirtualFree((LPVOID)st,0x1000,MEM_RELEASE);
printf("g_cs = %08x\ng_esp = %08x\n", g_cs, g_esp);
getchar();
return 0;
}
最后于 2021-8-13 19:30
被wx_大可爱编辑
,原因:
|
能力值:
( LV1,RANK:0 )
|
-
-
11 楼
taolaoda
任务段 eq 8003f0c0 0000a912`FDCC0068,大兄弟,如果我没记错的化是E9吧
经过测试,A9和E9都能跑
|