pwnable.kr-fd
题目
pwnable地址:http://pwnable.kr/play.php
题目名称:fd
1 | Mommy! what is a file descriptor in Linux? |
解题过程
查看文件
1 | $ ls -al |
查看fd.c源码
1 |
|
一些函数解释:
- atoi函数的作用是将开头包含数字的字符串转换成int类型整数。
- read函数的作用是从文件描述符fd读取一定字节长度的数据到缓冲区,
read(int fd, void *buf, size_t count)
,其中第一个参数fd的值代表文件描述符。这里的作用是获取键盘的标准输入内容,并放到缓冲区中。 - strcmp是一个字符串比较函数,用于比较两个字符串的ASCII大小。实际比较大小是根据第一个参数ASCII值减去第二个ASCII值的结果判断的。如果两个字符串数值相等,则返回0 。
- ! 代表逻辑取反,即:把非0的数值变为0,0变为1;
通过分析程序逻辑,可以想到,如果满足if(!strcmp("LETMEWIN\n", buf))
判断条件,即!strcmp("LETMEWIN\n", buf))
值为1时(即strcmp("LETMEWIN\n", buf)
值为0),就能够执行命令查看flag的内容。而当 buf == "LETMEWIN\n
时,strcmp返回结果为0。因此我们需要交互式输入的内容为LETMEWIN
,然后按下回车键,这样能够使buf的值为LETMEWIN\n
。
但是如果从键盘获取输入,文件描述符fd的值需要为0。代码中,fd的值由我们命令行输入的参数值转换成整数后,减去0x1234(即十进制4660)得到的,那么如果我们输入的值也是4460,经过计算后fd的就正好为0,这样我们就可以进行IO输入操作了。
操作
1 | $./fd 4660 |
flag:mommy! I think I know what a file descriptor is!!
pwntools漏洞利用
pwntools文档
1 | #!/usr/bin/python |
执行结果:
Linux 标准输入输出
linux贯彻”一切皆文件”的思想,任何操作都可以看作是对文件的读写。Linux通过标准输入输出(I/O)的方式实现对这些文件读写,在这个过程中,Linux会根据一个非负整数来标识对文件的读写操作,这个非负整数叫做文件描述符(file descriptor, fd),它有3个值,分别为0、1、2。
I/O即标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)。
标准输入即是从键盘输入,标准输出、标准错误输出即输出到终端,显示到屏幕。
文件描述符详解:
I/O | FD | 重定向操作符 | 含义 |
---|---|---|---|
standard input (STDIN) | 0 | < 或 <<,0< 或0<< | 读取输入的位置 |
standard output (STDOUT) | 1 | > 或 >>,1> 或 1>> | 写入输出的位置 |
standard error (STDERR) | 2 | 2> 或 2>> | 写入错误消息的位置 |
参考
- Post title:pwnable.kr-fd
- Post author:ssooking
- Create time:2019-12-30 14:34:00
- Post link:https://ssooking.github.io/2019/12/pwnable-kr-fd/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.