Понимание эксплойтов строки формата

Я изучаю различные эксплойты, и я не могу понять эксплойты Format String. У меня есть довольно простая программа, настроенная в среде, которая позволяет использовать эксплойт.

int woah(char *arg){
char buf[200];
snprintf(buf, sizeof buf, arg);
return 0;
}

Я могу контролировать аргумент, передаваемый в функцию, которая будет определять, как будет происходить атака с конечным результатом программы, запускающей мой шелл-код и дающей мне root. Сделать крах программы легко, просто введите "%s%s", и она выдаст ошибку. Мы хотим сделать больше, чем это, поэтому мы кормим его чем-то вроде «AAAA%x%x%x%x%x%x%x». Глядя на программу в gdb, мы смотрим на буфер сразу после snprinf и видим:

"AAAA849541414141353934....blah blah blah"

Это хорошо! Мы можем видеть буквы A в стеке, а также 41, которые представляют собой A в шестнадцатеричном формате. Но тогда что будет дальше? Я понимаю, что общая идея здесь состоит в том, чтобы перезаписать указатель инструкции четырьмя байтами, имея адрес в начале нашей строки, которую мы вводим… а затем где-то вдоль строки он указывает на наш шелл-код.

Как мне найти адрес seip/return для перезаписи?


person OneManRiot    schedule 27.09.2014    source источник
comment
Буквы А, которые вы видите, не находятся в стеке. Они печатаются, потому что ваши строки формата говорят об этом. 41-е это... Путеводитель в каком направлении? В чем вопрос?   -  person ericbn    schedule 28.09.2014
comment
Отредактировано для ясности. Я думаю, что следующий шаг в этом эксплойте — найти, где находится указатель инструкции, чтобы я мог перезаписать его адресом, указывающим обратно на мой буфер. Как мне найти любой адрес?   -  person OneManRiot    schedule 28.09.2014
comment
возможный дубликат ошибки строки формата - эксплуатация   -  person ericbn    schedule 28.09.2014


Ответы (1)


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

person sivector    schedule 27.09.2014