【问题标题】:Trying to overflow but not working as expected试图溢出但没有按预期工作
【发布时间】:2016-11-20 15:45:58
【问题描述】:

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

   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

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

【问题讨论】:

  • 您可能想查看指针本身,以了解它们之间有多少空间:printf("%p --- %p", (void*)tmp_test, (void*)tmp_test2)

标签: c malloc strcpy


【解决方案1】:

这很可能是因为你只写了超出 tmp_test 容量的额外 18 个字节,而两个块之间的 slack 空间显然比这更大。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您的程序调用undefined behaviour。无法预料会发生什么。在此程序中,当您尝试分配的元素多于分配的空间时,会导致出现 UB。 “我预计 tmp_test 会流向 tmp_test2” - 为什么会这样?

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多