gpt4 book ai didi

c - 如果我 strncat 到一个没有空终止符的字符串上,会发生什么?

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

设置:

给定这种代码:

char myString[4];
printf("%s\n", myString);
strncpy(myString, "hi", 2);
printf("%s\n", myString);
strncat(myString, "h123", 2);
printf("%s\n", myString);

这将打印:

 KU�
hiU�
hiU�h1

我的期望:

在我看来,myString 是一个指向内存中已分配位置的指针,如下所示:

MEMORY:  [random][random][random][\0][random][random][random]....
PRINTED: [random][random][random][\0]

它在字符串开头后的第四个位置添加一个指向内存的空指针

strncpy 之后:

MEMORY:  [h][i][random][\0][random][random][random]...
PRINTED: [h][i][random][\0]

它将前 2 个字符更改为 hi,并且不添加\0

strncat 之后:

MEMORY:  [h][i][random][h][1][2][3][\0]...
PRINTED: [h][i][random][h][1][2][3][\0]

它在字符串开头后查找\0,然后删除\0 并添加自己的字符串以及末尾的\0。

我预想的事情并没有发生。

问题:

  1. 里面打印的是什么?
  2. 哪一部分是我所期望的理解不正确的?

注意:

现在,我明白这种未定义的行为应该避免,但我是从尝试理解可在给定代码上使用的所有可能的漏洞利用的角度提出这个问题的。

我并不是在寻找正确的编码实践。我正在寻求了解到底出了什么问题。

编辑 1

我确实理解文档说它是未定义的行为,从开发人员的角度来看,我们必须避免可能出现的鼻恶魔。

但从攻击者的角度来看,这里发生了一些事情,这可能不仅仅是一个错误,而且可能是一个安全缺陷,可以更深入地理解,从而可以形成一致的攻击。我希望能有更深层次的理解。的

最佳答案

In my mind, myString is a pointer to an allocated spot in memory that looks like this:

MEMORY:  [random][random][random][\0][random][random][random]....

也许在你看来是这样,但实际上它会是这样的:

 MEMORY:  [random][random][random][random][random][random][random]....

事实上,正如评论所说,这些字符不是随机的而是不确定的。它们很可能是先前占用的堆栈帧的残余物,但您不知道。

当您在堆栈上分配 char 数组时,不会放入 nul 字节。它只是将堆栈指针增加 4,仅此而已。

编辑

抱歉,我没有阅读整个问题就跳了进来。

strncpy(myString, "hi", 2);

上面的行复制了一个 h,然后复制了一个 i,然后停止,因为它复制了两个字符。如果明智的话,它只会复制 h,然后复制 \0,但事实并非如此。

strncat 是一个奇怪的函数,可能应该被扔进火热的 hell 。它沿着第一个字符串的末尾,然后将第二个字符串中的 n 个字符和终止的 \0 相加。 n 与您要复制到的缓冲区的大小无关,因此可能会溢出。

strncat(myString, "h123", 2);

无法保证您的第一个字符串在任何地方都有 \0 (如前所述),因此它将把 h 和 1 复制到不确定的内存位置。

关于c - 如果我 strncat 到一个没有空终止符的字符串上,会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43065545/

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