Добрый день. В неком приложении есть уявзимость, позволяющая по произвольному адресу записать шел-код. Вопрос: как передать на него управление? (методы типа CreateRemoteThread и про контекст не предлагать, т.к. я сижу с ограниченными правами и процесс можно открывать только на PROCESS_QUERY_INFO....) Зато я могу записать в несуществующий участок памяти, вылезет исключение (изучил материал по SEH). В регистре FS:[0] лежит адрес обработчика SEH, ему передается управление. Вопрос: думал записать в жестко забитый адрес 7FFDF000 адрес моего шел-кода (типа того). Но вот насколько я понял, адрес SEH должен указывать на память, которая принадлежит стеку (которая в общем-то границы которой определены рядом (FS:[4] - FS:[8]). И вообще, написано что для каждого потока эти обработчики свои, не совсем понятно, что за участко памяти FS.. И что за адрес 7FFDF000. На разных тредах он отличается... Если я изменю границы FS:[4] - FS:[8] на свою область, что-то ведь не заработает? Итого: как можно запустить свой шел?
Приложение написано на С++? Можно попробовать перезаписать таблицу виртуальных ф-ий, так, чтобы вызвался переданный код. Но для этого таблица должна быть в записываемой памяти (так иногда бывает). Для таблицы по адресу 0x403000 и состоящей из четырех указателей должно быть примерно такое: db 0x403010 db 0x403010 db 0x403010 db 0x403010 xor eax, eax ... Когда произойдет косвенный вызов виртуальной ф-ии по одному из указателей, управление передастся на код по адресу 0x403010. Но надо учитывать, что страница по адресу 0x403000 должна быть записываемой и, вероятно, исполняемой, если приложение защищено DEP'ом. А это уже зависит от версии OS/SP. Это как один из вариантов, который первым приходит в голову.
Кстати в таблицу импорта можно записать. Обычно приложения, когда АПИ вызывают, смотрят адреса в секции импорта. Как только приложение вызовет чтонить из, kernel32.dll например, будет вызван нужный код. Опять таки есть масса нюансов, но возможно получится.
100gold, про "редактирование" указателей я знаю, тонкостей много. Это был запасной вариант, нужно было именно что-то иное.
test555 Шелл код получает управление посредством переполнения буферов - затирается адрес возврата из процедуры в стеке.
Я не знаю адрес стека, куда и какие адреса переписывать.. Я могу лишь только писать в произвольные адреса.
test555 А ты считаешь уязвимость переполнение буфера делается по известному адресу? Сначала скажи что за уязвимость, которая позволяет тебе писать в память? Что за программа, что за ОС? Без этого остальные расуждения - глупость. Если ты можешь писать что хочешь, куда хочешь - пропатчи чтобы JMP был на твой второй кусок кодов. Какая проблема? Только боюсь, что ты как все новички понял из шелл-кодов только первую половину - запись лишних байт на стек. А вот прыгнуть туда - это новички считают что легко, но они не поняли и сейчас им дадут волшебный ключик...
Если можешь писать в память чужого процесса, то перезапиши указатель по адрессу FS:[C0](для вин 7 и возможно Vista) или 7FFE0300 для ХР на свой код. Через эти адресса идут вызовы системных сервисов(функций) так что полюбом получиш управление.
XshStasX 7FFE0300 - это адрес ссылки на системный шлюз в USD, данный регион нельзя открыть для записи. Более того, этот блок общий для всех процессов и при изменении там данных в одном процессе, они тутже изменяться во всех. Что приведёт к бсоду в конце концов(будет фолт например в csrss).
XshStasX Да, конечно. Вот учите матчасть и без неё не следует утверждать совершенно нелепые вещи. Просто совет.