Недавно в моем университете было упражнение об атаках переполнения буфера.Несмотря на то, что я это сделал, у меня был вопрос с самого начала, но, похоже, никто еще не дал четкого ответа на него.
Итак: я использую в программе 2 разных метода ввода:
gets
function
в то время как цикл с fgetc
function
Я открываю исполняемые файлы с помощью gdb в Linux и запускаюони с таким же (больше, чем буфер [12]) вводом 32 "A".
Что я не понимаю:
Использование функции gets
,стек плавно перезаписывается и выдает ошибку сегментации: 0x41414141 в ??(), что является нормальным.
Используя функцию fgetc
в цикле while, буфер обычно записывается (12 байтов), НО после этого, хотя введенный мною вводдополнительные 20 байтов (сумма 32 байта), я вижу, что следует 0x0000000a (который является символом новой строки '\ n'), который принадлежит не там, а в конце.В добавление к этому после 0x0000000a он пропускает некоторые адреса памяти и продолжает перезаписывать стек снова с остальными входными данными.
Почему это происходит?
Метод 1:
#include <stdio.h>
void readString()
{
char buffer[12];
int i = 0;
int c;
/* Different input method */
gets(buffer);
/* End*/
puts(buffer);
}
int main()
{
puts("Please enter your name:\n");
readString();
return 0;
}
Метод 2:
#include <stdio.h>
void readString()
{
char buffer[12];
int i = 0;
int c;
/* Different input method */
while (1) {
c = fgetc(stdin);
if ((c == EOF) || (c == '\n'))
break;
buffer[i++] = c;
}
/* End*/
puts(buffer);
}
int main()
{
puts("Please enter your name:\n");
readString();
return 0;
}