美文网首页PWN学习资料
Pwnable.kr学习记录(一)

Pwnable.kr学习记录(一)

作者: Sarace | 来源:发表于2019-05-31 14:07 被阅读0次

    一、学习资料

    首先当然是先学习一波理论知识,这种入门的东西百度上一大堆,我就不一一列举了,这里只放一下我的参考资料。仅供参考。

    手把手教你栈溢出从入门到放弃

    二、学习实践

    在了解了基本知识之后,当然是要实践一下,我采用了Pwnable.kr,需要先自己注册一下,这里有不同难度的题目,内容涵盖多个领域,界面很可爱。youtube上也有相应的视频教程,这里有百度云的,提取码: 74ue不过建议先自己做,做出来之后可以再去看一看,学习一下新思路。

    Pwnable.kr-01 fd

    image.png

    首先ssh连上,ls看一下都有什么东西,

    1559279059270.png

    可以看到有个flag文件,我们看看里面有什么,

    1559279327276.png

    发现没有权限,这可怎么办呢?

    6983d90f5dd24481b88b197f862722d5.jpg

    从上面的图中,我们也能看到,我们对flag这个文件的权限是0。既然这个文件我们没有权限,那我么们就看看还有什么其他东西吧。我们发现还有一个fd.c和一个fd文件,我们对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){//这里判断命令行参数个数是否小于2
            printf("pass argv[1] a number\n");
            return 0;
        }
        int fd = atoi( argv[1] ) - 0x1234;//把第二个命令行参数转成数字,再减0x1234
        int len = 0;
        len = read(fd, buf, 32);//以fd为文件描述符读取32个字节内容
        if(!strcmp("LETMEWIN\n", buf)){//比较buf是否与"LETMEWIN\n"相等
            printf("good job :)\n");
            system("/bin/cat flag");//这里会输出flag文件的内容
            exit(0);
        }
        printf("learn about Linux file IO\n");
        return 0;
    
    }
    

    经过分析源码,我们可以知道,只需要让fd程序替我们把flag打印出来就行了,这里涉及到了linux用户特殊权限的问题,不懂的同学可以自行百度谷歌,或者点击这个链接,Linux系统中的文件的s权限。这里fd程序就拥有SGID权限,可以以fd组的权限运行,自然就能查看flag文件的内容。

    那怎么才能让fd程序帮助我们查看flag的内容呢?我们先随便运行一下看看效果。

    1559281002151.png

    发现并没有什么卵用,还叫我们去了解一下Linux的文件IO,好吧,那就去学习一下,FILE I/O

    学习之后我们终于明白了,原来标准输入stdin的文件描述符是0,所以我们的命令行第二个参数应该是0x1234的十进制形式,也就是4660,然后就可以从标准输入,也就是键盘读取了,我们只需要再输入LETMEWIN,然后敲回车就可以看到flag了。

    1559280408311.png

    这里并没有用的我们前面学习资料里讲的知识,因为这只是第一个题,比较简单,是新手入门的,后面我们就会逐渐用到前面的知识了。

    相关文章

      网友评论

        本文标题:Pwnable.kr学习记录(一)

        本文链接:https://www.haomeiwen.com/subject/ssiwtctx.html