如何通过gets向C输入一个空字符的字符串?

How to input a string to C with null character in it via gets?

我正在尝试演示缓冲区溢出,我希望用 gets 覆盖局部变量。我已经使用带有 -fno-stack-protector 的 gcc 编译了我的程序,所以我知道 gets 使用的缓冲区就在我试图覆盖的另一个局部变量旁边。我的目标是溢出缓冲区并覆盖相邻的变量,以便它们都具有相同的字符串。但是,我注意到我需要能够输入 '[=13=]' 字符,以便 strcmp 实际上会显示两者相等。如何输入 '[=13=]'?

在许多键盘上,您可以使用 ctrl@ 输入 NUL 字符(可能是 ctrlshift2ctrlalt2).

除此之外,您可以创建一个包含 NUL 字节的文件并将其重定向为标准输入。

我不确定您能否将 '[=10=]' 输入到 gets(3)fgets(3) 函数中,因为该函数会检查换行符并且可能有一些方法保护您不将 nul 终止符输入到 C 字符串(假设以 nul 字符终止)。

很可能,您要演示的内容与实现相关(因此,未定义的行为),并且对于不同的实现会有不同的工作方式。

如果您想只用一个输入语句正确覆盖局部变量,只需使用 read(2),它允许您输入空值和任何其他可能的字符值。