Ошибка шины при манипулировании виртуальными адресами - PullRequest
0 голосов
/ 23 марта 2020

Я написал небольшой фрагмент кода в C, чтобы проверить, как на самом деле работают механизмы защиты виртуальной памяти в Linux. Я использовал Ubuntu 18.04 LTS.

Итак, я пишу программу, которая читает собственные сопоставления виртуальной памяти в файле /proc/pid/maps. Затем программа начинает анализ этого файла и извлекает диапазоны адресов и разрешения. Для сопоставлений с разрешением на чтение программа выгружает содержимое в шестнадцатеричном формате, а для разрешения записи записывает произвольное содержимое в случайном месте, выбранном между адресами base и limit. Я понимаю, почему программа получает «Ошибка сегментации» при записи в произвольном месте. Но для разрешения на чтение я не могу объяснить, почему программа при запуске получает «Ошибка шины» даже с выровненным атрибутом для переменных-указателей, используемых для хранения виртуальных адресов. Вот функция dump, которую я написал:

void dump(char *base, char *limit) {
    char *p __attribute__ ((aligned (1))); // Enforce address alignment by the compiler
    for (p = base; p < limit; p = p + 0x1) 
        printf("%x", (char)(*p));
    printf("\n");
}

Другой вопрос: есть ли идея изменить память с разрешениями на выполнение (и запись), «вставляя» какой-то созданный код?

...