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
字符串,
( 注意: 在这里我故意将 fwrite
的 count
写大了,原本应是 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
输出为
( 注意: 在这里我故意将 fread
的 count
写大了,原本应是 3
我改成了 10
)
10out%
这个输出10
可以看出还是读取到了第10
个字节 内容却是 out%
而不是与 cat out
的输出不同,是为什么
上面的运行编译均在 linux
gcc
典型的越界访问,将3改为10导致程序会读取字符串“out”所在内存后面的内容,根据elf文件的格式,那些大概率是string table section中的其它字符串。