如何通过gets向C输入包含空字符的字符串?

如何通过gets向C输入包含空字符的字符串?,c,gcc,c-strings,buffer-overflow,gets,C,Gcc,C Strings,Buffer Overflow,Gets,我试图演示缓冲区溢出,我希望用get覆盖本地变量。我使用gcc和-fno stack protector编译了我的程序,因此我知道获取的使用的缓冲区就在我试图覆盖的另一个局部变量旁边。我的目标是使缓冲区溢出并覆盖相邻的变量,使它们具有相同的字符串。但是,我注意到我需要能够输入'\0'字符,以便strcmp实际显示两者相等。如何输入'\0'?在许多键盘上,您可以使用ctrl@(可能是ctrlshift2或CTRLT2)输入NUL字符 除此之外,您可以创建一个带有NUL字节的文件,并将其重定向为st

我试图演示缓冲区溢出,我希望用
get
覆盖本地变量。我使用gcc和
-fno stack protector
编译了我的程序,因此我知道
获取的
使用的缓冲区就在我试图覆盖的另一个局部变量旁边。我的目标是使缓冲区溢出并覆盖相邻的变量,使它们具有相同的字符串。但是,我注意到我需要能够输入
'\0'
字符,以便strcmp实际显示两者相等。如何输入
'\0'

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


除此之外,您可以创建一个带有NUL字节的文件,并将其重定向为stdin。

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


除此之外,您可以创建一个带有NUL字节的文件,并将其重定向为stdin。

我不确定您是否能够将
'\0'
输入到
get(3)
fgets(3)
函数中,因为该函数检查换行符,并且可能有某种方法可以防止您将NUL终止符输入C字符串(假定以nul字符终止)

很可能,您试图演示的是一些依赖于实现的东西(因此,未定义的行为),对于不同的实现,它们的工作方式会有所不同


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

我不确定您是否能够将
'\0'
输入
gets(3)
fgets(3)中
函数,因为该函数检查换行符,并且可能有某种方法保护您不将nul终止符输入到C字符串(假定该字符串在nul字符上终止)

很可能,您试图演示的是一些依赖于实现的东西(因此,未定义的行为),对于不同的实现,它们的工作方式会有所不同


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

谢谢,原来是
ctrl
+
alt
+
2
。谢谢,原来是
ctrl
+
alt
+
2
。我确实做到了,我认为你部分是正确的。我不认为EOF和“\0”是正确的,所以
gets
可能在看到换行符后停止,但不会以字符串的null终止字符停止。我最初的目标是使用
gets
的缓冲区溢出漏洞覆盖局部变量,因此我不能使用
write
。我从来没有说
'\0'
'\n'
是相同的…但是
'\0“
是C的字符串终止符,因此在通过输入流接收的情况下,它应该得到特殊处理(这就是我所说的),与
'\n'
的处理方式不同。因为它可以使客户端程序假定输入结束于此,而不是。如果必须实现,我将忽略它,或更改为特殊的字符序列。
EOF
不是字符,而是条件。您无法接收
EOF
,因为它不是字符。您通常会检测到
EOF
当没有更多字符进入时(您从
read(2)
syscall返回
0
)…但这是另一个故事。我确实做到了,我认为你部分正确。我不认为EOF和“\0”是正确的,所以
get
可能在看到换行符后停止,但不会以字符串的null终止字符停止。我最初的目标是使用的缓冲区溢出漏洞覆盖局部变量
获取
,所以我不能使用
写入
。我从来没有想说
'\0'
'\n'
是一样的……但是
'\0'
是C的字符串终止符,所以在通过输入流接收的情况下,它应该得到特殊处理(这就是我说的),与
'\n'
的处理方式不同。因为它可以使客户端程序假定输入结束于此,而不是。如果必须实现,我将忽略它,或更改为特殊的字符序列。
EOF
不是字符,而是条件。您无法接收
EOF
,因为它不是字符。您通常会检测到
EOF
当没有更多字符进入时(您从
read(2)
syscall返回
0
)。但这是另一个故事。