Функция защиты стека GCC с уровнями оптимизации - PullRequest
0 голосов
/ 20 марта 2019

Я провожу некоторые эксперименты с функцией защиты стека GCC, чтобы лучше ее понять.В основном я ссылался на этот пост на stackoverflow .

Ниже приведен мой код.

test.c

#include <stdio.h>

void write_at_index(char *arr, unsigned int idx, char val)
{
    arr[idx] = val;
    printf("\n%s %d arr[%u]=%d\n", __func__, __LINE__,
        idx, arr[idx]);
}

void test_stack_overflow()
{
    char a[16] = {0}; //Array of 16 bytes.

    write_at_index(a, 30/*idx*/, 10/*val*/); //Ask the other function to access 30th index.

    printf("\n%s %d Exiting a[0] %d\n", __func__, __LINE__, a[0]);
}

int main()
{
    test_stack_overflow();
    return 0;
}

Ниже приведен мой make-файл.

Makefile

CC=gcc

BIN=./test.out

SRCS=./test.c

all: $(BIN)

OBJ = ${SRCS:.c=.o}

CFLAGS=-O0 -fstack-protector -fstack-protector-all

$(OBJ): %.o: %.c
    $(CC) $(CFLAGS) $(INCLUDES) -c $*.c -o $*.o

$(BIN): $(OBJ)
    $(CC) -o $@ $<
    rm -rf ./*.o

clean:
    rm -rf ./*.out
    rm -rf ./*.o

Я использую gcc (Ubuntu 7.3.0-27ubuntu1 ~ 18.04) 7.3.0

Когда я собираю и запускаю test.out, я получаю аварийное завершение "обнаружение разбивания стека".

Однако, если я изменяю уровень оптимизации на O3, (CFLAGS=-O3 -fstack-protector -fstack-protector-all) и собираю и выполняю test.out, яя не наблюдаю сбой.

Так что мой вопрос: убирает ли компилятор параметр "-fstack-protector", когда оптимизация включена?Или я здесь пропускаю какие-то другие настройки?

1 Ответ

1 голос
/ 20 марта 2019

При более высоких уровнях оптимизации write_at_index встраивается в test_stack_overflow, и GCC обнаруживает, что весь массив a не используется каким-либо значимым образом, и устраняет его.В результате хранилище в массиве и связанное с ним переполнение буфера исчезли.Вам нужно было бы добавить барьер компилятора, чтобы этого не происходило.

Более того, переполнение в один байт вызывает только сбой средства защиты стека, если им удастся поразить канарейку (или адрес возврата).Таким образом, они не являются хорошим способом использовать код обнаружения переполнения стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...