21
Июл
2021

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

#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) ничего не изменял? Или посоветуйте другой компилятор

Источник: https://ru.stackoverflow.com/questions/1307386/%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0-%D0%B2-%D1%81%D1%82%D0%B5%D0%BA%D0%B5-%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80

Тебе может это понравится...

Добавить комментарий