我正在尝试在C语言中完成Smashing the Stack for Fun and Profit的一个示例,但目前遇到了一些困难,以下是代码(我的机器是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]
,那么同样的代码应该能正常工作,但实际上并非如此,它开始出现段错误。谢谢, Numan