Меры безопасности Linux против выполнения шелл-кода

Я изучаю основы компьютерной безопасности и пытаюсь выполнить написанный мной шеллкод. Я выполнил шаги, указанные здесь

http://dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf

http://webcache.googleusercontent.com/search?q=cache:O3uJcNhsksAJ:dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf+own+shellcode&cd=1&hl=nl&ct=clnk&gl=nl

$ cat pause.s
xor %eax,%eax
mov $29,%al     
int $0x80       
$ as -o pause.o pause.s
$ ld -o pause pause.o
ld: warning: cannot find entry symbol _start; defaulting to <<some address here>>
$ ./pause 
^C
$ objdump -d ./pause
pause:     file format elf64-x86_64
Disassembly of section .text:
      08048054 <.text>:
      8048054: 31 c0     xor    %eax,%eax
      8048056: b0 1d     mov    $0x1d,%al
      8048058: cd 80     int    $0x8
$

Так как моя программа pause заработала, я просто скопировал вывод objdump в c-файл.

тест.с:

int main()
{
    char s[] = "\x31\xc0\xb0\x1d\xcd\x80";
    (*(void(*)())s)();
}

Но это приводит к segfault. Теперь это может быть связано только с мерами безопасности Arch Linux (?). Итак, как я могу заставить это работать?


person Ram    schedule 15.09.2011    source источник
comment
возможно, страница s не сопоставлена ​​с разрешениями на выполнение? так как вы x86_64, у вас определенно есть аппаратная поддержка NX.   -  person Flexo    schedule 15.09.2011
comment
Ссылка заменена на «более безопасную» ссылку на документ Google. Вы можете подтвердить, что это один и тот же документ? Другая ссылка зависла на ПК с помощью Adobe Reader 9.1.0.   -  person sehe    schedule 15.09.2011
comment
@awoodland Вы правы! Я точно ничего не знал о бите NX. Для тех, кто хочет сопоставить разрешения exec (используя mmap), инструкции находятся здесь: thexploit.com/tag/shellcode   -  person Ram    schedule 15.09.2011
comment
@sehe Я не могу открыть ссылку, которую вы разместили. Я вернул его к исходному. Может быть, это Adobe?   -  person Ram    schedule 15.09.2011
comment
@Ram: ну да. Что еще. Будьте любезны вынести предупреждение? Я не думаю, что приемлемо публиковать документы, которые могут иметь DoS-потенциал. Особенно в постах, посвященных эксплойтам шеллкода.   -  person sehe    schedule 15.09.2011
comment
@Ram - думаю, тогда я напишу это как ответ   -  person Flexo    schedule 15.09.2011


Ответы (2)


Страница, на которой живет s, не сопоставлена ​​с разрешениями на выполнение. Поскольку вы используете x86_64, у вас определенно есть аппаратная поддержка NX. По умолчанию в наши дни код и данные находятся на очень разных страницах, а данные не имеют разрешения на выполнение.

Вы можете обойти это с помощью mmap() или mprotect() для выделения или изменения страниц с разрешением PROT_EXEC.

person Flexo    schedule 15.09.2011

Вы также можете использовать #define для определения вашего шелл-кода. Таким образом, препроцессор вставит код прямо в main.

  #define SHELLCODE "\x31\xc0\xb0\x1d\xcd\x80"
  int main()
  {
     (*(void(*)())SHELLCODE)();
  }

Старый стиль написания шеллкода не работает на новых системах из-за мер безопасности. Вам также, вероятно, придется компилировать с отключенной защитой стека:

 gcc -z execstack -fno-stack-protector shellcode.c -o shellcode

Вот полностью рабочий пример, использующий системный вызов выхода, который я тестировал на ядре 3.2.0.3 x86_64:

 #include<stdio.h>

 #define SHELLCODE "\x48\xc7\xc0\x3c\x00\x00\x00\x48\xc7\xc7\xe7\x03\x00\x00\x0f\05"

  main() 
  {
  int (*function)();

   // cast shellcode as a function
   function = (int(*)())SHELLCODE;

   // execute shellcode function
   (int)(*function)();
   return 0;
   }

Шелл-код использует 64-битные регистры, поэтому он не будет работать на 32-битной машине. Чтобы убедиться, что код работает, вы можете протестировать его с помощью strace:

strace shellcode
execve("./shellcode", ["shellcode"], [/* 38 vars */]) = 0
....
munmap(0x7ffff7fd5000, 144436)          = 0
_exit(999)        <---- we passed 999 to exit, our shellcode works! 
person Ivan Alagenchev    schedule 26.01.2013
comment
Я ценю вашу приверженность улучшению архивов. Хотя я не могу проверить, ваш ответ имеет смысл. Спасибо. - person Ram; 06.02.2013