| ||||||||||||||||
| ||||||||||||||||
| ||||||||||||||||
Переполнения стека. Часть 1 1. Введение Проблема переполнения локальных буферов возникла в софте с момента появления структурного программирования, то есть дробления кода модуля на процедуры и заключается в передаче в некоторый локальный буфер блока данных, превышающего размеры этого буфера. Схематически это выглядит так: Таким образом лишние данные записываются, вот в этом то и вся фишка,
записываются они в ту часть стека, которая предназначена для обеспечения
корректного возврата из процедуры. Таким образом переполнение приводит к
перезаписи некоторых регистров процессора, а конкретно регистра 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(Коды Операции) или по другому расшифровывается как Оптимизированные коды) - это машинные инструкции в цифровом
представлении. К примеру в ассемблере используются мнемокоды типа: |
|
| ||||||||||||||||
|