来源于互联网而非自己手动调试,供参考,是否真实一试便知,仅供备忘。
输入
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
-
末尾自动额外添加换行’\n’
-
0截断
printf
和scanf类似,输出方式取决于格式化字符串fmt参数的设置。我们这里不谈格式化字符串的漏洞
-
%s就是输出字符串
write
写入文件描述符,我们重点关注write(1,buf,cnt)
-
没有任何截断或换行,单纯打印到标准输出流。