pwn题解第一道

今天听说了一个网站pwnable.kr。很适合初学者,就试着做了一道题目。

第一道题目,按照网页上给的链接,使用putty链接工具联入。

输入ls命令查看文件内容。


很开心的看到了flag文件,于是直接打开,果然不出所料,我是没有权限打开的。然后查看了一下fd.c的代码。

#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;

}


很简单的代码。其实就是验证BUF里面是否是“LETMEWIN”;然后buf是从fd指向的文件读出来的。

可是fd又是什么呢,明显是个int。这又怎么指向文件呢。

原来在Linux下面,文件有一个文件符号表。每一个符号表里面都会给本进程打开的文件建立索引。所谓的int fd。其实就是一个文件的索引编号。

下面要解决的问题就是,怎么样保证让fd所指向的文件内容为LETMEWIN。观察上面的代码我们可以发现这段代码之前并没有任何打开文件,所以我们可以让下一个文件为0 。也就是说构造第一个参数为0x1234十进制的4660。然后接着按回车的时候回神奇地发现系统在等待,趁机把LETMEWIN输进去,果然成功拿到flag。至于原理吗?还是没有搞太清楚,估计是索引发现文件不存在的时候就会默认让新建一个文件。感兴趣的话可以到Linux上跑一跑试一试。


通过这个题目,可以对Linux的文件系统有个初步了解,就像游戏中问得一样——:“Mommy! what is a file descriptor in Linux?”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章