pwnable.kr-fd

问题描述

问题提示我们先学习linux文件描述符,然后登录服务器解题。
fd问题

需要知识

linux每打开一个文件,都要为其分配一个文件描述符,打开分配,关闭回收,并且有一个最大值。每次新打开一个文件,取当前可用的最小的文件描述符为其分配。特殊的,文件描述符0、1、2是系统预留的,0表示标准输入,1表示标准输出,2表示标准错误。这三个文件是早就系统一直打开的。0由键盘输入,1和2输出到屏幕。

c语言,argv数组表示运行时的命令参数,argv[0]表示当前运行的命令,argv[1]表示后面第一个参数,依次类推。
atoi()将字符串类型数字,转换成数字类型。
strcmp(a, b)比较a和b字符串内容。
read(int fd, char[32] buf, 32)从fd文件描述符所对应文件中,读取前32字节内容,放入buf中。

解题思路

先看一下进来之后有哪些文件。可以看到flag在当前目录下,但我们没有读权限。观察权限信息,我们有读fd.c的权限,和执行fd的权限。
目录下文件

打开fd.c程序,查看信息情况。整理思路。我们运行fd的第一个参数值减去0x1234后的数字,打开这个数字对应的文件,读取内容,如果内容等于“LETMEWIN\n”,就可以得到flag。
fd.c的内容

我一开始是认为会打开一个内容为“LETMEWIN\n”的文件,这样就搞定了。但是没有这样的文件,自然也就没有这个文件的fd描述符。尝试过在目录下新建文件,结果没有权限。直到查询到fd的三个系统默认预留fd。

所以我们将输入的argv[1]的值减0x1234等于0的话,就可以从标准输入来给buf赋值了。0x1234等于4660。结果如下,获得flag。
flag获得

posted @ 2022-03-30 11:03  宁宁鸡a  阅读(34)  评论(0编辑  收藏  举报