Как уже указывалось, порядок ваших объявлений никоим образом не может предсказать порядок размещения в стеке, даже без оптимизации. Это полностью зависит от реализации.
Однако, если вы переполните свой «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>