Как работают сани NOP?

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

Какой простой пример иллюстрирует этот метод?

Что означают такие термины, как 128-байтовый nop sled?


person amorimluc    schedule 07.02.2013    source источник
comment
просто интересно, каковы практические приложения, для которых вы планируете научиться делать это?   -  person Alex Gordon    schedule 08.02.2013
comment
Я студент CE и изучаю эту тему в учебнике Bryant, O'Hallaron CS:APP. Я также работаю в области ИТ-безопасности в своем колледже, поэтому меня это интересует.   -  person amorimluc    schedule 08.02.2013
comment
Вот что сказал бы социальный инженер! ;)   -  person DeepS1X    schedule 23.05.2017


Ответы (2)


Некоторые атаки состоят в том, чтобы заставить программу перейти на определенный адрес и продолжить работу оттуда. Внедренный код должен быть предварительно загружен каким-то образом именно в это место.

Рандомизация стека и другие различия во время выполнения могут сделать невозможным предсказать адрес, по которому программа перейдет, поэтому злоумышленник помещает салазки NOP в большой диапазон памяти. Если программа переместится куда-нибудь в салазках, она выполнит все оставшиеся NOP, ничего не делая, а затем запустит код полезной нагрузки прямо рядом с салазками.

Причина, по которой злоумышленник использует цепочку NOP, состоит в том, чтобы увеличить целевой адрес: код может перейти в любое место цепочки, а не точно в начало внедренного кода.

128-байтовый след NOP — это просто группа инструкций NOP шириной 128 байт.

ПРИМЕЧАНИЕ № 1: NOP (No-OPeration) — это инструкция, доступная в большинстве (всех?) архитектур, которая ничего не делает, кроме как занимает память и некоторое время выполнения.

ПРИМЕЧАНИЕ № 2: в архитектурах с инструкциями переменной длины инструкция NOP обычно имеет длину всего один байт, поэтому ее можно использовать в качестве удобного дополнения к инструкции. К сожалению, это также упрощает создание салазок NOP.

person rodrigo    schedule 07.02.2013
comment
Хорошо, я думаю, что понял суть нопсаней. Есть ли где-нибудь, на что вы могли бы указать, что показывает пример ассемблерного кода nop-sled? - person amorimluc; 08.02.2013
comment
Ноп-сани для меня пока немного абстрактны. Пример действительно поможет. - person amorimluc; 08.02.2013
comment
Лол, может быть, nop-блок можно было бы сократить на (...) - person amorimluc; 08.02.2013
comment
В классе, который я проходил, NOP-след не обязательно был последовательностью буквальных NOP, но также мог быть последовательностью инструкций, которые выглядят как настоящий код, но не имеют общего эффекта. Добавление единицы к регистру, а затем вычитание единицы из регистра не имеет существенного побочного эффекта, но сканеру гораздо сложнее распознать, чем набор буквальных инструкций NOP подряд. - person Adrian McCarthy; 08.02.2013
comment
@PascalCuoq Современные слайды nop не содержат большой последовательности nop. Почему? Безопасность была усилена, чтобы обнаруживать большое количество nop. Черные шляпы включают случайные команды для подделки реальной памяти и заманивания такого защитного программного обеспечения. - person basickarl; 16.10.2014
comment
@amorimluc: В NASM times 128 nop собрать 128 однобайтовых инструкций NOP (код операции 0x90). x86 также имеет многобайтовые инструкции NOP, которые любой хороший ассемблер использует для заполнения директив ALIGN. Это важно для выполнения обычного кода (не внедряемого) при использовании внутри функций для выравнивания целей ветвления (например, начала цикла), потому что NOP на самом деле выполняется один раз, и быстрее декодировать один длинный NOP, чем множество коротких NOP. одинаковая длина. (И множество коротких NOP могут даже вызвать косвенные эффекты производительности, такие как предотвращение попадания этого 32-битного блока кода в кэш uop). - person Peter Cordes; 09.10.2017

Чтобы добавить к объяснению Родриго: даже с салазками NOP приблизительное расположение буфера в памяти должно быть предсказано заранее. Один из методов приблизительного определения расположения в памяти состоит в том, чтобы использовать соседнее расположение в стеке в качестве системы отсчета. Вычитая смещение из этого местоположения, можно получить относительный адрес любой переменной.

ПРИМЕЧАНИЕ: в архитектуре x86 инструкция NOP эквивалентна шестнадцатеричному байту 0x90, поэтому заполненный буфер эксплойта может выглядеть примерно так:

| сани NOP | Шеллкод | Повторный обратный адрес|

Поскольку регистр EIP указывает на любой адрес, найденный в цепочке NOP, он будет увеличиваться при выполнении каждой инструкции NOP, по одной, пока, наконец, не достигнет шелл-кода.

person Boschko    schedule 03.11.2017
comment
Можно ли объяснить вашу технику, чтобы найти приблизительное место в памяти буфера? Я не уверен, что это возможно без использования информации об утечке памяти (из-за уязвимости или чего-то еще)... - person Duke Nukem; 17.08.2018