Переполнение буфера (buffer overrun)
Я недавно начал изучать строение памяти, размещение в ней различных данных. Решил попробовать переполнение буфера, но столкнулся с проблемой. Дело в том, что в старых книгах указывается, что обычные переменные функции размещаются в стеке от старших к младшим, но у меня переменные функции main размещены от младшего к старшему. Немного поэксперементировав, я понял, что адреса обычных переменных в функции размещаются от младшего к старшему, но если следом вызвать другую функцию, то в ней адреса будут младше прошлой функции, что подобает стеку, хотя адреса её переменных размещены от младшего к старшему. Но дело в том, что этому правилу обычные переменные не следуют, если кроме них инициализированы массивы. Обычные переменные, такие как типа integer, всегда будут младше адресом, чем массивы (буферы). Вот код программы доказывающий это:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char buffer_1[4], buffer_2[4];
int value = 5;
strcpy(buffer_1, "111");
strcpy(buffer_2, "222");
printf("buffer_1 @ %p \'%s\'\n", buffer_1, buffer_1);
printf("buffer_2 @ %p \'%s\'\n", buffer_2, buffer_2);
printf("value @ %p = %d (0x%08x)\n\n", &value, value, value);
strcpy(buffer_1, argv[1]);
printf("buffer_1 @ %p \'%s\'\n", buffer_1, buffer_1);
printf("buffer_2 @ %p \'%s\'\n", buffer_2, buffer_2);
printf("value @ %p = %d (0x%08x)\n", &value, value, value);
return 0;
}
В данном коде создаётся два массива, и переменная типа int, отображается их значение, далее через консоль вводится аргумент, который копируется в первый массив.
Ну и главный вопрос, как перезаписать значение переменной типа int через переполнение буфера, как это сделано в книге?