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

时间:2016-11-20 15:45:58

标签: c malloc strcpy

我试图将一个缓冲区溢出到另一个缓冲区作为实验来学习。

   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

我在免费时收到错误,但其他一切看起来都很糟糕。

2 个答案:

答案 0 :(得分:1)

这很可能是因为你只写了超过tmp_test容量的18个字节,并且两个块之间的松弛空间明显大于那个。

在每个块的标题中,C运行时存储了几个指针(它取决于实现,但可能多达3个),并且从错误消息中我推断出您在64位系统上,因此每个指针长度为8个字节,这意味着两个缓冲区之间的松弛空间可能是24个字节或更多。

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

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

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

如果您想要试验的是缓冲溢出,那么请记住,它们在堆栈上分配的缓冲区中更常见,而不是从堆中动态分配。< / p>

答案 1 :(得分:0)

您的计划会调用undefined behaviour。人们无法预料会发生什么。在此程序中,当您尝试分配的元素多于分配的空间时,会导致UB。 &#34;我希望tmp_test能够流向tmp_test2&#34; - 你为什么期待这个?