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