fd.c的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h> #include <stdlib.h> #include <string.h> char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc<2){ printf("pass argv[1] a number\n"); return 0; } int fd = atoi( argv[1] ) - 0x1234; int len = 0; len = read(fd, buf, 32); if(!strcmp("LETMEWIN\n", buf)){ printf("good job :)\n"); system("/bin/cat flag"); exit(0); } printf("learn about Linux file IO\n"); return 0;
}
|
代码逻辑比较清楚,需要输入一个数字,然后减去0x1234,所得的值作为read函数的第一个参数,然后调用read函数读取输入,然后将读取的值和“LETMEWIN\n”比较,若相等则cat输出flag文件中的值。
接下来我们看一下read函数的函数描述:
1 2 3 4 5 6 7 8
| NAME read - read from a file descriptor
SYNOPSIS #include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
|
可以看到第一个参数为文件描述符。在Linux系统中存在三个比较特殊的文件描述符:
文件描述符 |
用途 |
POISX名称 |
stdio流 |
0 |
标准输入 |
STDIN_FILENO |
stdin |
1 |
标准输出 |
STDOUT_FILENO |
stdout |
2 |
标准错误 |
STDERR_FILENO |
stderr |
这里我们可以让read参数的第一个参数为0(从标准输入读取),然后输入“LETMEWIN”即可让程序执行cat flag操作。 |
|
|
|
1 2 3 4 5
| fd@ubuntu:~$ ./fd 4660 LETMEWIN good job :) mommy! I think I know what a file descriptor is!!
|
注:fd,file decriptor 文件描述符