Я пытаюсь сделать пример из Smashing the Stack для удовольствия и прибыли в C, но я застрял в какой-то момент,
Ниже приведен код (у меня есть 64-битная машина с 64-битной Ubuntu):
int main()
{
int x;
x = 0;
func(1,2,3);
x = 1;
printf("x is : %d\n", x);
}
void func(int a, int b, int c)
{
char buffer[1];
int *ret;
ret = buffer + 17;
(*ret) += 7;
}
Приведенный выше код работает нормально, и при возврате строка x=1
не выполняется, но я не могу понять логику ret = buffer + 17;
, не должно ли это быть ret = buffer + 16;
, т. Е. 8 байтов для буфера и 8 для сохраненный базовый указатель в стеке.
Во-вторых, я понимаю, что char buffer[1]
занимает 8 байтов (из-за 64-битной арки)
и если я увеличу этот буфер до buffer[2]
, все тот же код должен работать нормально, НО этого не происходит, и он начинает выдавать ошибку сегмента.
С уважением,
Ньюмэн