gpt4 book ai didi

c - 尝试溢出但未按预期工作

转载 作者:行者123 更新时间:2023-11-30 19:11:03 25 4
gpt4 key购买 nike

我正在尝试将一个缓冲区溢出到另一个缓冲区,作为学习的一种尝试。

   char* tmp_test = malloc(8);
char* tmp_test2 = malloc(8);
strcpy(tmp_test2,"ABCDEFG\n");
strcpy(tmp_test,"abcdefghijklmnopqrstuvxyz\n" );

printf("1th string %s" , tmp_test);
printf("2th string %s" , tmp_test2);
free(tmp_test);
free(tmp_test2);

我希望 tmp_test 流向 tmp_test2,但这并没有发生。

>1th string abcdefghijklmnopqrstuvxyz
>2th string ABCDEFG
>*** Error in `./Start': munmap_chunk(): invalid pointer: 0x00000000023bf860 ***
>Aborted

我在免费时遇到错误,但其他一切看起来都正常。

最佳答案

这很可能是因为您只写入了超出 tmp_test 容量的额外 18 个字节,而两个 block 之间的松弛空间显然比这要大。

在每个 block 的 header 中,C 运行时存储了一些指针(这取决于实现,但可能多达 3 个),从错误消息中我推断您使用的是 64 位系统,因此每个指针的长度为 8 字节,这意味着两个缓冲区之间的空闲空间很可能为 24 字节或更多。

此外,当运行时处于 Debug模式时,它会在 block 之间分配更多的死区,正是为了帮助检测缓冲区溢出。

所以,尝试使用更长的字符串,最终你会让一个字符串溢出到另一个字符串中。

您还可以使用调试器查看内存,看看两个字符串在内存中相距多远,从而找出两个 block 之间有多少松弛空间,而无需进行反复试验。

如果您想尝试的是缓冲区溢出,请记住,它们在堆栈上分配的缓冲区中更为常见,而不是从堆中动态分配。

关于c - 尝试溢出但未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40705991/

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