gpt4 book ai didi

c - Stack Smashing 尝试给出段错误

转载 作者:太空狗 更新时间:2023-10-29 16:24:11 24 4
gpt4 key购买 nike

我正在尝试从 Smashing the Stack for Fun and Profit 做一个例子在 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],同样的代码应该仍然可以正常工作,但是这并没有发生,它开始出现段错误。

问候,努曼

最佳答案

无论是 8 位微型计算机、16 位微型计算机、32 位 PC 还是 64 位新 PC,我使用的每个体系结构上的“char”都是 8 位宽。另一方面,Int 往往是字的大小。

将局部变量放入堆栈的顺序可以是特定于实现的。我的猜测是您的编译器将“int *ret”放在“char buffer 1”之前的堆栈上。所以,为了得到返回地址,我们必须经过“char buffer 1”(1 字节)、“int *ret”(8 字节)和保存的基指针(8 字节),总共 17字节。

这是 x86 64 位上堆栈帧的描述: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/projects/x86-64

关于c - Stack Smashing 尝试给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/490851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com