Почему я получаю сообщение «Не удается найти границу текущей функции», когда перезаписываю адрес возврата уязвимой программы? - PullRequest
5 голосов
/ 05 января 2012

Я хочу использовать переполнение буфера на основе стека для образовательных целей.

Существует типичная функция, вызываемая с параметром из main, который задается в качестве входных данных из программы локального буфера, в котором сохранен параметр,Учитывая вход, такой, что nops+shellcode+address_shellcode, я буду использовать его.

После отладки с помощью gdb я нашел адрес шелл-кода, который будет передаваться в качестве параметра, и сразу после strcpy я проверяю стек, а $ebp+8, который является адресом возврата, успешно перезаписываетсяс адресом шелл-кода.Так что у меня есть то, что я хочу.Но когда я сделал шаг вперед, я получил:

->shellcode_address in ?? ()

, а затем

Cannot find bound of current function

Адрес возврата имеет значение, которое я хочу.Есть идеи, что происходит?

Также, когда я выполняю это, у меня возникает ошибка сегментации, и я компилирую это с -g -fno-stack-protector.Почему?

Ответы [ 4 ]

6 голосов
/ 06 февраля 2014

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

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

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

При возникновении этой ошибки отладчик выводит сообщение об ошибке, которое вы видите.

Обычно отладчик все еще может выполнять основные функции: он может отображать регистры и память в вашей программе, он все еще может выполнять пошаговые операции и устанавливать точки останова и т. Д. У него будут проблемы при выполнении вещей, требующих более сложной интерпретации: он не может определить, где находятся фреймы стека, не может найти локальные переменные по имени и т. Д.

0 голосов
/ 05 января 2012

Вы выполняете код в стеке и спрашиваете GDB, в какой функции вы находитесь.
Очевидно, что GDB сбит с толку, потому что вы не находитесь ни в какой функции.Таким образом, он показывает адрес и «??»

Вы должны скомпилировать с -no-stack-protector, потому что stack-protector защищает вас от того, что вы пытаетесь сделать.Я не говорю, что нет никакого способа обойти это, но это требует больше усилий и хорошего понимания механизма защиты.

0 голосов
/ 27 апреля 2012

Скорее всего, у вас проблема переполнения буфера где-то в функции (или что-то типа того). Перезаписывает текущий кадр стека вашей функции с нерелевантными данными, и уничтожает адрес возврата в процессе, который обычно хранится там среди прочего. В результате код «возвращается» в какое-то непредсказуемое место и не может понять, куда он вернулся. Это то, что вызывает сообщение об ошибке.

0 голосов
/ 05 января 2012

Предполагая, что ваш дистрибутив Linux является последним, и вы работаете на архитектуре x86ish, вы больше не можете выполнять код оболочки из памяти пространства пользователя (это также относится к другим архитектурам, я просто не знаком с ними).Есть несколько причин, в вашем случае, скорее всего, установка бита nx.Перейдите на ваши справочные страницы по безопасности Linux, и вы увидите большое количество мер безопасности, включенных по умолчанию;и Google "разбить стек для удовольствия в 2011 году" для возможных путей обхода.Компиляция только с -fno-stack-protector означает не устанавливать канареечное значение;но этого недостаточно.Если вы хотите сделать это в образовательных целях, я предлагаю установить виртуальную машину, подобную virtualbox, и установить на нее старый дистрибутив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...