Переполнение буфера в стеке. Компилятор

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int check_authentication(char *pas)
{
    char pas_buffer[16];
    int auth_flag = 0;

    strcpy(pas_buffer, pas);

    if(strcmp(pas_buffer, "brillig") == 0)
        auth_flag = 1;
    if(strcmp(pas_buffer, "outgrabe") == 0)
        auth_flag = 1;

    return auth_flag;
}

int main(int argc, char *argv[])
{
    if(argc < 2) {
        printf("Usage: %s <password>\n", argv[0]);
        exit(0);
    }
    if(check_authentication(argv[1]))
            printf("Access Granted\n");
    else
        printf("Access Denied\n");

    return 0;
}

При переполнении буфера программы, в переменную auth_flag заноситсся ненулевое значение, из-за чего получаем "Access Granted". Но ведь переменная auth_flag должно добавляться в стек после массивка pas_buffer. Т.е. значение переменной auth_flag должно оставаться равным 0

Изучаю переполнение буфера. Но столкнулся с такой проблемой, что переменные в стеке хранятся в неправильном порядке. Узнал, что компилятор может менять порядок переменных в стеке(для оптимизации или чего-то еще). Можно как-нибудь сделать так, чтобы компилятор(gcc) ничего не изменял? Или посоветуйте другой компилятор


Ответы (0 шт):