Атака переполнения буфера в C - не может перезаписать стек - PullRequest
0 голосов
/ 24 мая 2018

Недавно в моем университете было упражнение об атаках переполнения буфера.Несмотря на то, что я это сделал, у меня был вопрос с самого начала, но, похоже, никто еще не дал четкого ответа на него.

Итак: я использую в программе 2 разных метода ввода:

  1. gets function

  2. в то время как цикл с 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;
}
...