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


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

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

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

2 53

2 ответа:

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

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

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

128-байтовый NOP sled-это просто группа NOP intructions шириной 128 байт.

Примечание #1: NOP (No-OPeration) является ли инструкция доступна в большинстве (все?) архитектуры, которые ничего не делают, кроме как занимают память и некоторые во время выполнения.

примечание #2: в архитектурах с инструкциями переменной длины, инструкция НОП обычно как раз один байт в длине, поэтому ее можно использовать как удобная прокладка инструкции. К сожалению, это также позволяет легко сделать сани NOP.

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

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

/ NOP sled / Shellcode / Repeated return address/

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