我以为我找到了一个漏洞……

主要观点:作者在改进 DOS 模拟器时发现 COMMAND.COM 处理文件写入时出现问题,不同编译器在文件读写操作上表现不同,经研究发现 C 库中关于文件读写方向切换的规定由来已久,自 1979 年起基本未变,当前不同操作系统的库在文件读写处理上存在差异,历史源码也显示了这一规定的演变过程。
关键信息:

  • COMMAND.COM 处理文件写入的复杂流程及问题。
  • 不同编译器(如 Microsoft Visual C++ 6.0、IBM C/C++ 3.6 等)在文件读写上的表现。
  • C 库中关于文件读写方向切换的规定及演变(从 1978 年的 K&R 到各版本 ANSI C 等)。
  • 不同操作系统(如 Linux、FreeBSD、Microsoft 等)的库在文件读写处理上的差异。
  • 历史源码中不同 Unix 版本(如 32V UNIX、V6 UNIX、System III、V7 UNIX、2BSD 等)在文件操作方面的情况。
    重要细节:
  • COMMAND.COM 处理文件时先打开、写入、关闭,再重新打开、回溯、读取、写入、关闭。
  • Microsoft 运行时 ferror() 设但 errno 为 0,IBM 运行时 ferror() 清但 errno 为 41 及对应错误含义。
  • Linux(glibc)和 FreeBSD 允许自由混合读写,Microsoft 库需在切换读写方向时进行刷新或定位。
  • 不同 Unix 版本中 fopen() 的实现及对更新模式的支持情况等。
阅读 7
0 条评论