pwnable.kr-fd
问题描述
问题提示我们先学习linux文件描述符,然后登录服务器解题。
需要知识
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。
我一开始是认为会打开一个内容为“LETMEWIN\n”的文件,这样就搞定了。但是没有这样的文件,自然也就没有这个文件的fd描述符。尝试过在目录下新建文件,结果没有权限。直到查询到fd的三个系统默认预留fd。
所以我们将输入的argv[1]的值减0x1234等于0的话,就可以从标准输入来给buf赋值了。0x1234等于4660。结果如下,获得flag。