Я изучаю различные эксплойты, и я не могу понять эксплойты 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 для перезаписи?