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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






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





Размещение шеллкода в памяти

Шеллкод обычно вставляется в уязвимую программу через аргументы командной строки, переменные окружения или строку ввода. В любом случае при создании шеллкода, мы не знаем адрес, по которому он расположен. И все же мы должны знать адрес строки "/bin/sh". Небольшая хитрость позволит нам это сделать.

При вызове подпрограммы при помощи инструкции call, процессор сохраняет адрес возврата в стек, этот адрес непосредственно следует за адресом инструкции call (см. выше). Обычно, следующий шаг - сохранить состояние стека (особенно регистр %ebp инструкцией push %ebp). Чтобы получить адрес возврата при входе в подпрограмму, достаточно забрать его из стека инструкцией pop. Конечно, мы сохраним нашу строку "/bin/sh" непосредственно после инструкции call, чтобы позволить нашему "самедельному прологу" предоставить нам нужный адрес строки. Итак :

 beginning_of_shellcode:
    jmp subroutine_call

 subroutine:
    popl %esi
    ...
    (Шеллкод)
    ...
 subroutine_call:
    call subroutine
    /bin/sh

Конечно подпрограмма у нас не настоящая: или вызов execve() будет успешным и процесс заменится оболочкой, или он закончится неуспешно и функция _exit() завершит программу. Регистр %esi дает нам адрес строки "/bin/sh". Теперь этого достаточно, чтобы построить массив, поместив адрес после строки: первый элемент массива (в %esi+8, длина /bin/sh + нулевой байт) содержит значение регистра %esi, второй - в %esi+12 - нулевой адрес (32 бита). Код будет выглядеть так:

    popl %esi
    movl %esi, 0x8(%esi)
    movl $0x00, 0xc(%esi)

Диаграмма 6 показывает область данных:

Диаграмма 6 : массив данных
область данных

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



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





Copyright © 2005-2016 Project.Net.Ru