Поэтому я работаю над назначением для класса безопасности, и назначение состоит в том, чтобы использовать переполнение стека для вызова функции oopsDidISmashTheStack, которая никогда не использовала ее в программе.
#include <stdio.h>
#include <stdlib.h>
int oopsDidISmashTheStack(void)
{
printf("Yup, smashing the stack is fun!\n");
exit(0);
}
int getUserInput (void)
{
char buf[12];
gets(buf);
return(1);
}
int main(void)
{
getUserInput ();
printf("Overflow failed, normal return\n");
return(1);
}
Я понимаю концепцию того, что после переменной buf есть sfp, а затем обратный адрес, который я не могу понять, это вход, который изменит возвращаемое значение на адрес 0x080484fc, где находится функция. Я подумал, что для заполнения буфера потребуются 12 символов, а затем у меня сложилось впечатление, что sfp и возврат где 4 байта, поэтому я пытаюсь заполнить sfp еще 4 случайными символами, а затем использовать \ xfc \ x84 \ x04 \ x08, чтобы сделать обратный адрес указывает на функцию.
Если кто-то знаком с тем, как работает стековая память, и может объяснить, где я ошибаюсь, это было бы здорово?
Вы в значительной степени на правильном пути. Я предлагаю вам взглянуть на стек и посмотреть, находится ли обратный адрес там, где вы думаете. Там может быть что-то еще. Также дважды проверьте конечность,
Я полагаю, это ваша входная строка?
«012345678901xxxx \ хк \ x84 \ x04 \ x08»
Каков вывод вашей программы, как правило, если вы близки, но не совсем правильно поняли, что программа вылетает 🙂
Других решений пока нет …