我正在尝试从Smashing the Stack for Fun and Profit in C 中举一个例子,但我有点卡住了,下面是代码(我有一个 64 位机器和 Ubuntu 64 位):
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 错误。
问候,努曼