П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 4098 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6759 раз(а).

Учебник HTML.
Просмотров 3720 раз(а).

Руководство по PHP5.
Просмотров 5993 раз(а).

Хостинг через призму DNS.
Просмотров 4815 раз(а).

Подборка текстов стандартных документов.
Просмотров 56246 раз(а).

Учебник PHP - Самоучитель
Просмотров 3706 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 8346 раз(а).

Внешние атаки...
Просмотров 4566 раз(а).

Учебник PHP.
Просмотров 3175 раз(а).

SSI в примерах.
Просмотров 176 раз(а).






 
 
| Добавить в избранное | Сделать стартовой Project.Net.Ru | Помощь





Создание шеллкода

В некоторых случаях возможно влиять на содержимое стека процесса перезаписью адреса возврата функции, заставляя приложение выполнить некоторый произвольный код. Это особенно интересно для взломщика, если приложение работает под ID, отличным от ID пользователя(программа Set-UID или демон). Этот тип ошибки черезвычайно опасен, если приложение, такое как программа для чтения документов, запущено другим пользователем. Известная ошибка Acrobat Reader, когда измененный документ мог вызвать переполнение буфера. Эта ошибка также присутствует в сетевых сервисах (например imap).

В следующих статьях мы поговорим о механизмах, используемых для выполнения инструкций. Здесь мы начнем изучать сам код, который мы хотим исполнить в основном приложении. Простейшее решение - иметь код для запуска оболочки. Читатель сможет затем произвести другие действия, такие как изменение прав доступа к /etc/passwd. По причинам, которые станут далее очивидными, эта программа должна быть написана на языке ассемблера. Этот тип маленьких программ для запуска оболочки обычно называют шеллкод.

Рассмотреные примеры сделаны по статье Aleph One "Smashing the Stack for Fun and Profit" из журнала Phrack номер 49.

 

На языке Си

Цель шеллкода - запустить оболочку. Следующая программа на Си делает это:

/* shellcode1.c */

    #include <stdio.h>
    #include <unistd.h>

int main()
{
  char * name[] = {"/bin/sh", NULL};
  execve(name[0], name, NULL);
  return (0);
}

Среди множества функций, при помощи которых можно вызвать оболочку, много причин за то, чтобы использовать execve(). Во-первых, это настоящий системный вызов, в отличие от других функций из семейства exec(), которые по сути являются функциями библиотеки GlibC основанными на execve(). Системный вызов происходит при помощи прерывания. Достаточно определить регистры и их значения, чтобы получить эффективный и короткий ассемблерный код.

Кроме того, если execve() успешно выполнена, вызывающая программа (в нашем случае основное приложение) замещается выполняемым кодом новой программы и данный код запускается. Если вызов execve() оказался неуспешным, выполнение программы продолжается. В нашем примере код вставлен в середину атакуемого приложения. Продолжение выполнения будет бессмысленным и даже может быть пагубным. Поэтому выполнение должно быть завершено как только это возможно. return(0) позволяет выйти из программы, только если эта инструкция вызвана их функции main(), что не похоже на наш случай. Поэтому мы должны закончить выполнение функцией exit().

/* shellcode2.c */

    #include <stdio.h>
    #include <unistd.h>

int main()
{
  char * name [] = {"/bin/sh", NULL};
  execve (name [0], name, NULL);
  exit (0);
}

Фактически exit() это еще одна библиотечная функция, которая надстроена над настоящим системным вызовом _exit(). Новые изменения делают нас ближе к системе:

/* shellcode3.c */
    #include <unistd.h>
    #include <stdio.h>

int main()
{
  char * name [] = {"/bin/sh", NULL};
  execve (name [0], name, NULL);
  _exit(0);
}
Теперь время сравнить нашу программу с ее ассемблерным эквивалентом.

Назад | Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru