Underground InformatioN Center [&articles] 
[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]

STACK OVERFLOWS - Переполнения стека
Part №1

Ошибка переполнения стека

1. Введение
Проблема переполнения локальных буферов возникла в софте с момента появления структурного программирования, то есть дробления кода модуля на процедуры и заключается в передаче в некоторый локальный буфер блока данных, превышающего размеры этого буфера. Схематически это выглядит так:


Таким образом лишние данные записываются, вот в этом то и вся фишка, записываются они в ту часть стека, которая предназначена для обеспечения корректного возврата из процедуры. Таким образом переполнение приводит к перезаписи некоторых регистров процессора, а конкретно регистра EIP(командный указатель) и регистра EBP(база для стековых операций). К чему это приводит - судите сами:

В данном случае в EIP попал код 0х41 что соответствует ASCII коду литеры 'A'-это означает что приложение попыталось заполнить локальный буфер строкой состоящей из литер А, а поскольку длина строки превысила размер буфера то и произошло переполнение. Данный пример показывает, что переполнение изменило обычный процесс исполнения программы и привело к переходу по адресу, который благодаря переполнению попал в командный указатель. Теперь, собственно, можно перейти к описанию эксплоитов.

2. Эксплоиты
2. Эксплоиты Exploit(анг.-использовать в своих целях) - Таким образом названа строка кода, вызывающая описанное выше переполнение локального буфера. Но эксплоит - это не просто тупой набор символов приводящий к завершению приложения(это обычный DoS-Denial Of Service), а интеллектуальная строка-иначе говоря программа. Это означает что вместо символов она содержит опкоды(машинные инструкции), исполняемые процессором и потому после переполнения процессор перейдет по адресу который будет указывать на эти инструкции и исполнит их. Основная трудность заключается в определении этого адреса с целью последующей его передачи в командный указатель. Рассмотрим следующую схему:

При переполнении buffer'а, как видно из рисунка, будут затерты сохран.значение EBP и адрес возврата. Запустив SoftIce легко определить положение того байта в строке передаваемой в буфер который затрет собой первый байт адреса возврата. Далее начиная с определенной выше позиции помещаем 4-байтовый указатель на наш код. При выходе из процедуры команда ret вытолкнет этот указатель в EIP и исполнение программы продолжится с нашего адреса. Этот адрес опять же можно определить с помощью SoftIce. Но есть и другой способ-по возвращении из процедуры регистр ESP будет указывать на область в которой располагается наш код-потомму гораздо еффективнее передать в EIP адрес инструкции call esp которая может располагаться в любой длл, подгружаемой программой-остается лишь выяснить этот адрес-для этого выясняется список импорта, берется Hiew и в выбранной длл ищется инструкция call esp, затем найденное смещение складывается с ImageBase и в итоге получается абсолютный виртуальный адрес необходимой инструкции, который и передается в EIP.
Вбиваем в Сайс(SoftIce): s 10000000 L ffffffff ff e4
то есть искать ff e4(jmp esp) с 10000000 по ffffffff
И результат: Pattern found at 0010:77e8898B, что соответствует kernel32.dll.
Этот метод удобнее, потому как Сайс ищет прямо в памяти взрываемой проги - если естественно она в Сайс загружена и трассируется в данный момент.

3. Цель создания эксплоита
Необходимо отметить что все эксплоиты делятся на две группы - локальные и удаленные. Удаленные используются в основном в локальных и глобальных сетях для получения доступа к удаленной машине. Для создания и внедрения удаленных эксплоитов требуется достаточно серьезная подготовка-поэтому мы будем рассматривать локальные эксплоиты, имеющие своей целью атаку локальной машины. К примеру вы имеете доступ к машине с ОС WinNT WKS или Win2000Pro и злой админ запретил вам выход в инет. "Так как его проучить?" - ответ прост - создайте локальный эксплоит. "И что это мне даст?"- спросите вы - да почти все! Простой пример расставить точки над i.
Все работали с RAS, но мало кто знает, что он подвержен переполнению буфера в очень банальном месте. Если передать слишком длинный номер телефона ISP то rasman.exe вылетит. Очень важна следующая особенность - к примеру, если вы запустите мейлер и попробуете отправить почту, то винда предложит вам подсоединиться к интернету. Перед этим нужно заменить файл телефонной книги rasphone.pbk на одноименный файл, содержащий вместо телефона провайдера, эксплоит. Для изменения этого файла не нужны специальные разрешения если конечно админ их не создал. Но обычно с этим все в порядке. Так как rasman запустится в системном контексте(то есть с привилегиями системы - для него буде создан такой дескриптор LSA), то запущенная в результате переполнения консоль будет обладать правами аналогичными правам админа, ну а теперь уж делай, чего душа пожелает и знания позволяют. Вместо мейлера можно запустить браузер и запросить какой-нибудь URL, которого нет в кэше - Iexplorer предложит подключится и вот-тут то и запустится rasman.exe. Вообщем поле для деятельности обширное.

4.Как определить чего взрывать
Как обычно есть проверенный годами метод тыка - проверяйте на уязвимость все модули, парсирующие строки-от строки адреса в вашем браузере или NetMeeting'e до rundll32 - если сможете.
Можно использовать SoftIce, но это дело для подготовленных людей. Наиболее простой способ - искать информацию в интрнете на различных форумах и сайтах, посвященных эксплоитам - ищите и обрящете - и затем просто усовершенствовать написанное - это лучший способ обучения. Тут же можно смесло сказать, что bugTraq (www.securityfocus.com) является самым большим архивом в мире по эксплоитам.

5.Чего лучше на(ш)кодить?
ИМХО: наилучшим продолжением взрываемой проги(для тех кто в танке - для программы, уязвимой для stackoverflow) является запуск консоли. Это легко проделать запустив командную оболочку типа cmd.exe - в Unix-системах это называется shell. А реализовать вызов cmd.exe можно с помощью вызова функции system(), экспортируемой из msvcrt.dll. Ежели программа использует данную dll'ку, то вам пофартило, а ежели нет, то придется использовать LoadLibrary() в паре с GetProcAddress(). Причиной такого совета является то, что знающий человек с помощью шелла, запущенного в контексте system(для NT и других) или root(Unix и подобные) может горы свернуть, к примеру создаст нового юзера с правами Админа просто вставив его в группу "Администраторы"(NT) и затем войдя вновь этим юзером удалит старый аккаунт администратора (это если нужно админа проучить), либо включит группу простых юзеров в группу "Администраторы" - таким образом каждый новый юзер будет входить в контексте администратора и администратор не сразу поймет. Хотел бы заметить, что это распространяется только для локальных профилей юзеров - глобальные профили хранятся на первичном контроллере домена и изменив администратора на localhost'e вы не заденете группу "Администраторы" домена.

6.Структурная схема построения эксплоита

Структурная схема эксплоита

Опкоды(сокр: Operation Code(Коды Операции) или по другому расшифровывается как Оптимизированные коды) - это машинные инструкции в цифровом представлении. К примеру в ассемблере используются мнемокоды типа:
mov eax,ebx
push eax
ret
Опкоды для приведенных выше асм-инструкций имеют вид:
mov eax,ebx >> 66 8B C3
push eax >> 66 50
ret >> C3
для получения вида опкодов для любых мнемоник можно использовать любой ассемблер.
Я лично пользуюсь ассемблером, встроенным в Hiew.


Happy END of Part №1

Hope u'll like it guys.
buLLet
bullet@uinc.ru
uinC Member
[c]uinC

Все документы и программы на этом сайте собраны ТОЛЬКО для образовательных целей, мы не отвечаем ни за какие последствия, которые имели место как следствие использования этих материалов\программ. Вы используете все вышеперечисленное на свой страх и риск.

Любые материалы с этого сайта не могут быть скопированы без разрешения автора или администрации.


[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]
 Underground InformatioN Center [&articles] 
2000-2015 © uinC Team