Заметил, что в последних Knoppix и Qubuntu на старте экзешника всегда меняется значение регистра ESP, причём меняется очень сильно. Т.к. я пытаюсь эксплотировать тестовое приложение через переполнение стека, желательно, чтобы ESP не менялся Я могу, конечно, изменить код экзешника, чтобы зафиксировать макушку стека, но, в общем случае, доступа к экзешнику у меня может и не быть (удалённый фтп-сервер и т.п.) Как же быть? Во-первых, можно ли как-то повлиять на загрузчик, чтобы начальное значение ESP не менялось? Во-вторых, можно ли вообще хоть теоретически шелл-кодить под процесс, у которого всё время меняется адрес стека? Если да, то подкиньте ссылку на примерчик. Хотя мне кажется, что никак... Заранее благодарен!
Quantum Если в процессе есть что-то находящееся по известному адресу то можно поискать там команду call/jmp esp или с любым другим регистром который в момент переполнения имеет значение попадающее в переполняемый буфер. Но если там еще и код грузится по случайному адресу, тогда нереально.
Я конечно не силен в юникс системах, но может этот адрес можно узнать ? А вот если нельзя, то уже думать как избавитсья от этого... но это так, размышления
TermoSINteZ Для теста я в main() добавил код, который на старте распечатывает ESP. Вот и заметил, что на некоторых линуксах значение при каждом старте отличается. Потом в gdb загрузил - так и оказалось. Я, конечно, могу в тестовой проге создать процесс и явно указать для него адрес стека или просто направить ESP куда-нибудь в секцию данных, ведь базовый адрес кода и данных меняться не должен. Но это не решение, т.к. обычно модифицировать подопытное приложение нельзя. Black_mirror Не понял. В смысле, внедриться в процесс? Но это нарушает философию эксплоита, да и не выйдет, если эксплотировать удалённо. Сдаётся мне, что ты другое имеешь в виду, но что?.. Код всегда грузится по базовому адресу, как в винде. Можно, конечно, сделать так, чтобы грузился по случайному адресу, но тогда зацепок вообще не останется и такой случай я пока не рассматриваю.
Quantum Этот метод описывался в какой-то статье, но в какой я не помню. Нужно в коде процесса найти байты FF E4(jmp esp) или FF D4 (call esp) находящиеся по какому-то известному адресу. Адрес возврата затираем адресом найденной команды (если конечно все байты адреса являются допустимыми для эксплоита). Тогда при возврате мы попадём на команду которая перейдет по адресу находящемуся в esp. Этот адрес попадает на начало области где были входные параметры уязвимой процедуры если она не чистит стек, или сразу за ними.
Вчера попробовал! Повезло найти статический FFE4, немного подправил логику эксплоита - всё работает просто замечательно!!! Спасибо за идею!