Zj_W1nd's BLOG

简短的IO函数特性整理——受scanf启发

2025/03/11

来源于互联网而非自己手动调试,供参考,是否真实一试便知,仅供备忘。

输入

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

打印到标准输出,无截断

CATALOG
  1. 1. 输入
  2. 2. gets(buf)
  3. 3. read(0,buf,cnt)
  4. 4. scanf
  5. 5. puts
  6. 6. printf
  7. 7. write