来源于互联网而非自己手动调试,供参考,是否真实一试便知,仅供备忘。
输入
gets(buf)
-
是否能溢出:不检查长度,任意溢出
-
截断要求:换行截断(\n,\x0a)和EOF截断。换行符会被丢弃。其他空白字符均会原本输入。
-
其他处理:结尾自动添加\x00
read(0,buf,cnt)
作为一个系统调用,和其他的输入函数确实有本质区别。
-
是否能溢出:参数3有长度限制,不合理时可能导致溢出。
-
截断要求:没有截断字符,读够缓冲区数据或cnt字节后立刻返回。其中终端默认规范下回车会导致提交,结果中会包含有\n存在。默认情况下read在没有可用数据时会阻塞。可以说是最通用的,直接在pwntools中调用send就可以无损发送数据。
scanf
参考文章
scanf的输入方式取决于其格式化占位符。我们下面重点关注存在溢出的%s
-
是否能溢出:取决于格式化字符串。其中’%s’并不检查输入长度,数字
-
截断要求:注意,scanf由空格区分不同的格式化参数,即scanf(‘%s’)是空格(\x20)截断的。另外反直觉的是,scanf(‘%s’)没有0截断。
puts
自动添加换行
printf
字符串形式输出,0截断
write
打印到标准输出,无截断