任务段
前置准备
- 在程序中获取到
tss
的地址, 例如:00407030
; - 拼接段描述符: 0000e940`703020ac;
- 修改
GDTR
中段描述符;
知识点
_KTSS结构体
1 | // _KTSS 结构原形 |
代码实验
1 | // 当输入CR3后进入0环断点后的各种情况 |
通过jmp指令提权
- jmp可以通过任务段提权, 同时替换CS和SS寄存器
怎样返回3环
使用call跨段跳转时会保存cs、esp、ss、eip, 使用任务门时没保存这些值, 怎么返回?
1 | void __declspec(naked) test() |
问题剖析
- 恢复运行后将导致系统崩溃, 中断门会修改VM、NT、IF、TF位, 并按照堆栈返回, 当NT位置0后再根据堆栈返回时将出现系统崩溃;
- iretd指令首先检测eflag.NT位, 如果NT位等于0, 就按照堆栈返回; 如果NT位等于1, 就按照Backlink找到要返回的上下文环境返回;
- 解决方式
1
2
3
4
5
6
7
8
9
10
11
12
13void __declspec(naked) test()
{
__asm
{
int 3;
pushfd;
pop eax;
or eax, 0x4000;
push eax;
popfd;
iretd;
}
}- 需要手动修复dg 28中_KTSS结构的CR3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
...
PROCESS 85b021a8 SessionId: 1 Cid: 0e60 Peb: 7ffde000 ParentCid: 0e4c
DirBase: 3f344640 ObjectTable: 959357d8 HandleCount: 7.
Image: 09_27_TaskSegments(ÈÎÎñ¶Î).exe
kd> dg 28
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0028 80b98c00 000020ab TSS32 Busy 0 Nb By P Nl 0000008b
kd> dt _KTSS 80b98c00
ntdll!_KTSS
+0x000 Backlink : 0
+0x002 Reserved0 : 0
+0x004 Esp0 : 0x83f75cb0
+0x008 Ss0 : 0x10
+0x00a Reserved1 : 0
+0x00c NotUsed1 : [4] 0
+0x01c CR3 : 0 // <-- 需要手动修复成该程序的CR3
+0x020 Eip : 0
+0x024 EFlags : 0
+0x028 Eax : 0
+0x02c Ecx : 0
+0x030 Edx : 0
+0x034 Ebx : 0
+0x038 Esp : 0
+0x03c Ebp : 0
+0x040 Esi : 0
+0x044 Edi : 0
+0x048 Es : 0
+0x04a Reserved2 : 0
+0x04c Cs : 0
+0x04e Reserved3 : 0
+0x050 Ss : 0
+0x052 Reserved4 : 0
+0x054 Ds : 0
+0x056 Reserved5 : 0
+0x058 Fs : 0
+0x05a Reserved6 : 0
+0x05c Gs : 0
+0x05e Reserved7 : 0
+0x060 LDT : 0
+0x062 Reserved8 : 0
+0x064 Flags : 0
+0x066 IoMapBase : 0x20ac
+0x068 IoMaps : [1] _KiIoAccessMap
+0x208c IntDirectionMap : [32] "???"
kd> eq 80b98c00+1c 3f344640
WriteVirtual: 80b98c1c not properly sign extended
kd> dt _KTSS 80b98c00
ntdll!_KTSS
+0x000 Backlink : 0
+0x002 Reserved0 : 0
+0x004 Esp0 : 0x83f75cb0
+0x008 Ss0 : 0x10
+0x00a Reserved1 : 0
+0x00c NotUsed1 : [4] 0
+0x01c CR3 : 0x3f344640 // <-- 修复后
+0x020 Eip : 0
+0x024 EFlags : 0
+0x028 Eax : 0
+0x02c Ecx : 0
+0x030 Edx : 0
+0x034 Ebx : 0
+0x038 Esp : 0
+0x03c Ebp : 0
+0x040 Esi : 0
+0x044 Edi : 0
+0x048 Es : 0
+0x04a Reserved2 : 0
+0x04c Cs : 0
+0x04e Reserved3 : 0
+0x050 Ss : 0
+0x052 Reserved4 : 0
+0x054 Ds : 0
+0x056 Reserved5 : 0
+0x058 Fs : 0
+0x05a Reserved6 : 0
+0x05c Gs : 0
+0x05e Reserved7 : 0
+0x060 LDT : 0
+0x062 Reserved8 : 0
+0x064 Flags : 0
+0x066 IoMapBase : 0x20ac
+0x068 IoMaps : [1] _KiIoAccessMap
+0x208c IntDirectionMap : [32] "???"
完整代码
包含使用jmp指令实现任务切换
1 | // 09_27_TaskSegments(任务段).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 |