试图溢出但没有按预期工作

Trying to overflow but not working as expected

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

   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

我在 free 上出现错误,但其他一切看起来都正常。

您的程序调用 undefined behaviour。人们无法预料会发生什么。在此程序中,当您尝试分配的元素多于分配给 space 的元素时,就会导致 UB。 "I expect the tmp_test to flow over to tmp_test2" - 你为什么这么期待?

这很可能是因为您只写入了超出 tmp_test 容量的额外 18 个字节,并且两个块之间的 slack space显然比那个大。

在每个块的 header 中,C 运行时存储了一些指针,(这取决于实现,但可能多达 3 个,)并且从错误消息中我推断你是在 64 位系统上,所以每个指针都是 8 个字节长,这意味着两个缓冲区之间的松弛 space 很可能是 24 个字节或更多。

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

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

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

如果您想要试验的是缓冲区 溢出,请记住它们在堆栈上分配的缓冲区中比动态分配的缓冲区更常见来自堆。