C fwrite 写入二进制文件问题

c 经验太少,请教

// size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );

void fw(){
    // char *demo = "out.txt";
    char *demo = "out";
    FILE *f = fopen(demo,"wb+");
    fwrite(demo,1,/*3*/10,f);
    fclose(f);
}
void fr(){
    // char *demo  = "out.txt";
    char *demo = "out";
    FILE *f = fopen(demo,"rb+");
    char ctx[10];
    int numread = fread(ctx,1,/*3*/10,f);
    printf("%d",numread);
    printf("%s",ctx);
    fclose(f);
}

上面两个函数中 fw 在向二进制文件 out 写入 out 字符串,
( 注意: 在这里我故意将 fwritecount 写大了,原本应是 3 我改成了 10)

使用 cat out 得到函数 fw 写入的二进制文件的内容为:

outrb+%s%

函数 fw 写入的二进制文件的大小( stat out 得到):

  文件:out
  大小:10              块:8          IO 块:4096   普通文件
设备:802h/2050d        Inode:804906      硬链接:1
权限:(0644/-rw-r--r--)  Uid:( 1000/wingdust)   Gid:( 1000/wingdust)
最近访问:2021-11-01 15:44:58.789548880 +0800
最近更改:2021-11-01 15:44:58.306210867 +0800
最近改动:2021-11-01 15:44:58.306210867 +0800
创建时间:2021-11-01 15:44:58.306210867 +0800

想问这个 rb+%s% 是什么?

而在后面运行函数 fr 输出为
( 注意: 在这里我故意将 freadcount 写大了,原本应是 3 我改成了 10)

10out%   

这个输出10可以看出还是读取到了第10个字节 内容却是 out%
而不是与 cat out 的输出不同,是为什么

上面的运行编译均在 linux gcc

阅读 3.2k
2 个回答

典型的越界访问,将3改为10导致程序会读取字符串“out”所在内存后面的内容,根据elf文件的格式,那些大概率是string table section中的其它字符串。

fw 的案例看 youth7 的答案。
fr 的案例原因是你写入的数据里包含 NULfw 越界读的时候把 C 字符串末尾的 \0 也给写进文件里了。

cat 看不到是因为 \0 是不可打印的字符,建议换个能看16进制数据的编辑器打开看看。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进