Переполнение буфера (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 через переполнение буфера, как это сделано в книге?


Ответы (0 шт):