Встретил в книге по другому языку пример такого кода на C
int main(int argc, char **argv) {
unsigned long a[1];
a[3] = 0x7ffff7b36cebUL;
return 0;
}
Объясняется он следующим образом:
В сгенерированном компилятором C машинном коде функции main массив a
размещен в стеке на три слова раньше адреса возврата, поэтому запись значения 0x7ffff7b36cebUL
в a[3]
изменяет адрес возврата из main, так что он указывает на какой-то код из стандартной библиотеки C, который пытается прочитать пароль из файла .netrc. После возврата из main выполнение возобновляется не с команды, следующей за вызовом main, а с машинного кода, соответствующего таким строкам из библиотеки:
warnx(_("Error: .netrc file is readable by others."));
warnx(_("Remove password or make file unreadable by others."));
goto bad;
Мне как человеку, не знакомому с языками семейства С, это объяснение никак не проясняет ситуацию. Расскажите, пожалуйста, подробнее и более простым языком, как такой код приводит к возникновению ошибки. Особенно вот это
запись значения 0x7ffff7b36cebUL
в a[3]
изменяет адрес возврата из main