О позиции шеллкода переполнения буфера

Я изучаю эксплойт. Во всех примерах BOF шелл-код всегда помещается в буфер => шелл-код + заполнение + перезапись адреса возврата. Можно ли разместить шелл-код после того, как адрес возврата перезапишет предыдущий кадр стека в случае, если буфер слишком мал => заполнение + перезапись адреса возврата + шелл-код ??


person logicalway    schedule 06.04.2015    source источник


Ответы (1)


Конечно, это возможно в том случае, как вы сказали, когда буфер слишком мал. Существует пользовательское место под названием «переменные среды», оно расположено в стеке, так что вы можете легко проверить его через gdb. Это немного дальше от вершины стека. Просто используйте эту команду «x/500s $esp», и вы найдете все переменные с их адресами. Затем все, что вам нужно сделать, это подготовить ваш шелл-код (с некоторым NOP-следом) и экспортировать его в вашу новую переменную среды, в качестве следующего шага вам нужно получить адрес вашего окружения. Переменная. Лучше делать это с помощью дампов ядра, т.к. это точнее, чем gdb (в gdb немного другие адреса, чем в реале, потому что есть сдвиг). Или просто используйте эту небольшую программу, написанную Джоном Эриксоном - getenvaddr.c

Таким образом, ваша полезная нагрузка на данный момент будет выглядеть так: [ Junk | СФП | Обратный адрес ]

Например:

  • Мусор = 40 * А

  • СФП = 4 * В

  • Обратный адрес = 0xXXXXXXXX ‹-- Здесь находится адрес вашего env. переменная, туда вы захотите прыгнуть.

Второй вариант легко поставить свой шеллкод после буфера, в случае, если есть место.

Таким образом, ваша полезная нагрузка может выглядеть так: [ Junk | СФП | Обратный адрес | сани NOP | Шеллкод ]

  • Мусор = 40 байт (40 * A)
  • СФП = 4 * В
  • Адрес возврата = 0xXXXXXXXX ‹-- Вам нужно перейти куда-нибудь в NOP
  • NOP саней = x90 * 30
  • Шеллкод
person Yeez    schedule 07.04.2015
comment
Спасибо за ответ. Я думаю, что никто никогда не ответит на мой вопрос - person logicalway; 28.08.2015