如何通过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 字符(可能是 ctrlshift2 或 ctrlalt2).
除此之外,您可以创建一个包含 NUL 字节的文件并将其重定向为标准输入。
我不确定您能否将 '[=10=]'
输入到 gets(3)
或 fgets(3)
函数中,因为该函数会检查换行符并且可能有一些方法保护您不将 nul 终止符输入到 C 字符串(假设以 nul 字符终止)。
很可能,您要演示的内容与实现相关(因此,未定义的行为),并且对于不同的实现会有不同的工作方式。
如果您想只用一个输入语句正确覆盖局部变量,只需使用 read(2)
,它允许您输入空值和任何其他可能的字符值。
我正在尝试演示缓冲区溢出,我希望用 gets
覆盖局部变量。我已经使用带有 -fno-stack-protector
的 gcc 编译了我的程序,所以我知道 gets
使用的缓冲区就在我试图覆盖的另一个局部变量旁边。我的目标是溢出缓冲区并覆盖相邻的变量,以便它们都具有相同的字符串。但是,我注意到我需要能够输入 '[=13=]'
字符,以便 strcmp 实际上会显示两者相等。如何输入 '[=13=]'
?
在许多键盘上,您可以使用 ctrl@ 输入 NUL 字符(可能是 ctrlshift2 或 ctrlalt2).
除此之外,您可以创建一个包含 NUL 字节的文件并将其重定向为标准输入。
我不确定您能否将 '[=10=]'
输入到 gets(3)
或 fgets(3)
函数中,因为该函数会检查换行符并且可能有一些方法保护您不将 nul 终止符输入到 C 字符串(假设以 nul 字符终止)。
很可能,您要演示的内容与实现相关(因此,未定义的行为),并且对于不同的实现会有不同的工作方式。
如果您想只用一个输入语句正确覆盖局部变量,只需使用 read(2)
,它允许您输入空值和任何其他可能的字符值。