Библиотека Интернет Индустрии I2R.ru |
|||
|
Переполнения стека. Часть 11. Введение Проблема переполнения локальных буферов возникла в софте с момента появления структурного программирования, то есть дробления кода модуля на процедуры и заключается в передаче в некоторый локальный буфер блока данных, превышающего размеры этого буфера. Схематически это выглядит так: Таким образом лишние данные записываются, вот в этом то и вся фишка,
записываются они в ту часть стека, которая предназначена для обеспечения
корректного возврата из процедуры. Таким образом переполнение приводит к
перезаписи некоторых регистров процессора, а конкретно регистра
EIP(командный указатель) и регистра EBP(база для стековых операций). К
чему это приводит - судите сами: В данном случае в EIP попал код 0х41 что соответствует ASCII коду литеры 'A'-это означает что приложение попыталось заполнить локальный буфер строкой состоящей из литер А, а поскольку длина строки превысила размер буфера то и произошло переполнение. Данный пример показывает, что переполнение изменило обычный процесс исполнения программы и привело к переходу по адресу, который благодаря переполнению попал в командный указатель. Теперь, собственно, можно перейти к описанию эксплоитов.
2. Эксплоиты Exploit(анг.-использовать в своих целях) - Таким образом названа строка кода, вызывающая описанное выше переполнение локального буфера. Но эксплоит - это не просто тупой набор символов приводящий к завершению приложения(это обычный DoS-Denial Of Service), а интеллектуальная строка-иначе говоря программа. Это означает что вместо символов она содержит опкоды(машинные инструкции), исполняемые процессором и потому после переполнения процессор перейдет по адресу который будет указывать на эти инструкции и исполнит их. Основная трудность заключается в определении этого адреса с целью последующей его передачи в командный указатель. Рассмотрим следующую схему: При переполнении buffer'а, как видно из рисунка, будут затерты
сохран.значение EBP и адрес возврата. Запустив SoftIce легко определить
положение того байта в строке передаваемой в буфер который затрет собой
первый байт адреса возврата. Далее начиная с определенной выше позиции
помещаем 4-байтовый указатель на наш код. При выходе из процедуры команда
ret вытолкнет этот указатель в EIP и исполнение программы продолжится с
нашего адреса. Этот адрес опять же можно определить с помощью SoftIce. Но
есть и другой способ-по возвращении из процедуры регистр ESP будет
указывать на область в которой располагается наш код-потомму гораздо
еффективнее передать в EIP адрес инструкции call esp которая может
располагаться в любой длл, подгружаемой программой-остается лишь выяснить
этот адрес-для этого выясняется список импорта, берется Hiew и в выбранной
длл ищется инструкция call esp, затем найденное смещение складывается с
ImageBase и в итоге получается абсолютный виртуальный адрес необходимой
инструкции, который и передается в EIP.
3. Цель создания эксплоита Необходимо отметить что все эксплоиты делятся на две группы - локальные
и удаленные. Удаленные используются в основном в локальных и глобальных
сетях для получения доступа к удаленной машине. Для создания и внедрения
удаленных эксплоитов требуется достаточно серьезная подготовка-поэтому мы
будем рассматривать локальные эксплоиты, имеющие своей целью атаку
локальной машины. К примеру вы имеете доступ к машине с ОС WinNT WKS или
Win2000Pro и злой админ запретил вам выход в инет. "Так как его проучить?"
- ответ прост - создайте локальный эксплоит. "И что это мне даст?"-
спросите вы - да почти все! Простой пример расставить точки над i.
4.Как определить чего взрывать Как обычно есть проверенный годами метод тыка - проверяйте на
уязвимость все модули, парсирующие строки-от строки адреса в вашем
браузере или NetMeeting'e до rundll32 - если сможете.
5.Чего лучше на( ИМХО: наилучшим продолжением взрываемой проги(для тех кто в танке - для программы, уязвимой для stackoverflow) является запуск консоли. Это легко проделать запустив командную оболочку типа cmd.exe - в Unix-системах это называется shell. А реализовать вызов cmd.exe можно с помощью вызова функции system(), экспортируемой из msvcrt.dll. Ежели программа использует данную dll'ку, то вам пофартило, а ежели нет, то придется использовать LoadLibrary() в паре с GetProcAddress(). Причиной такого совета является то, что знающий человек с помощью шелла, запущенного в контексте system(для NT и других) или root(Unix и подобные) может горы свернуть, к примеру создаст нового юзера с правами Админа просто вставив его в группу "Администраторы"(NT) и затем войдя вновь этим юзером удалит старый аккаунт администратора (это если нужно админа проучить), либо включит группу простых юзеров в группу "Администраторы" - таким образом каждый новый юзер будет входить в контексте администратора и администратор не сразу поймет. Хотел бы заметить, что это распространяется только для локальных профилей юзеров - глобальные профили хранятся на первичном контроллере домена и изменив администратора на localhost'e вы не заденете группу "Администраторы" домена.
6.Структурная схема построения эксплоита Опкоды(сокр: Operation Code(Коды Операции) или по другому
расшифровывается как Оптимизированные коды) - это машинные инструкции в
цифровом представлении. К примеру в ассемблере используются мнемокоды
типа: |
|
2000-2008 г. Все авторские права соблюдены. |
|