Я пытаюсь сделать пример из Smashing the Stack for Fun and Profit на 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]
, все равно тот же код должен работать нормально, НО этого не происходит, и он начинает выдавать ошибку seg.
С уважением, Ньюман