порядок инициализации проблемы в проблеме переполнения буфера - PullRequest
0 голосов
/ 02 ноября 2018

Во-первых, это проблема с домашним заданием. Я не уверен, что все в порядке, но не пишите ничего о том, как изменить значение int.

У меня вопрос, есть ли у меня заказ

int set_me = 0;
char buf[15];

переключиться на

char buf[15];
int set_me = 0;

Это все равно изменит целое число, переполнив массив char. Я использую gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c для компиляции файла. Я думаю, -O0 позволил gcc не оптимизировать стек, поэтому int a char [] должны быть в порядке, как они есть в коде c. Оригинальный код сделал что-то в условии if, которое там не отображается.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

int main(int argc, char** argv)
{
        if(argc != 2)

        {

                printf("usage:\n%s string\n", argv[0]);
                return EXIT_FAILURE;
        }
        int set_me = 0;
        char buf[15];

        if(set_me == 1111222){}
        return EXIT_SUCCESS;
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Как уже указывалось, порядок ваших объявлений никоим образом не может предсказать порядок размещения в стеке, даже без оптимизации. Это полностью зависит от реализации.

Однако, если вы переполните свой «buf», вы будете писать по старшим и старшим адресам, но стек (как правило) уменьшается вниз.

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

Неконтролируемое переполнение может привести к всевозможному странному поведению, особенно если перезаписанный адрес возврата указывает на некоторый исполняемый код. Это типичная установка для атак переполнения.

У меня вопрос, есть ли у меня порядок

int set_me = 0;
char buf[15];

переключиться на

char buf[15];
int set_me = 0;

Это все равно изменит целое число путем переполнения массива char. Я использую gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c для компиляции файла. Я предполагаю, что -O0 позволяет gcc не оптимизировать стек, поэтому int и char [] должны быть такими же, как в коде c. Оригинальный код сделал что-то в условии if, которое там не отображается. <</p>

0 голосов
/ 02 ноября 2018

Порядок переменных в стеке зависит от реализации.

То, что переменные определены в определенном порядке в коде, не означает, что они будут в том же порядке в скомпилированной программе. Добавление большего количества переменных разных типов может изменить или не изменить порядок, как и изменение настроек оптимизации.

Если вы тестируете переполнение буфера, вам нужно поиграться с объявлениями переменных, пока не получите нужный макет.

...